1.类加载机制

jvm把class文件加载到内存,并对数据进行校验、解析和初始化,最终形成jvm可以直接使用的java类型的过程。

(1)加载

将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区中的运行时数据结构,在堆中生成一个代表这个类的java.lang.Class对象,作为方法区类数据的访问入口。

(2)链接 将java类的二进制代码合并到jvm的运行状态之中的过程

2.1 验证确保加载的类信息符合jvm规范,没有安全方面的问题。2.2 准备 正式为类变量(static变量)分配内存并设置类变量初始值的阶段,这些内存都将在方法区中进行分配。2.3 解析虚拟机常量池内的符号引用替换为直接引用的过程。(比如String s ="aaa",转化为 s的地址指向“aaa”的地址)

(3)初始化

初始化阶段是执行类构造器方法的过程。类构造器方法是由编译器自动收集类中的所有类变量的赋值动作和静态语句块(static块)中的语句合并产生的。

当初始化一个类的时候,如果发现其父类还没有进行过初始化,则需要先初始化其父类的初始化

虚拟机会保证一个类的构造器方法在多线程环境中被正确加锁和同步

当访问一个java类的静态域时,只有真正声明这个静态变量的类才会被初始化。

2.类加载过程

类加载过程分为:类的主动引用和类的被动引用

类的主动引用(一定会发生类的初始化)

--new一个类的对象--调用类的静态成员(除了final常量)和静态方法--使用java.lang.reflect包的方法对类进行反射调用--当初始化一个类,如果其父类没有被初始化,则先初始化他的父类--当要执行某个程序时,一定先启动main方法所在的类

类的被动引用(不会发生类的初始化)

--当访问一个静态变量时,只有真正生命这个静态变量的类才会被初始化(通过子类引用父类的静态变量,不会导致子类初始化)--通过数组定义类应用,不会触发此类的初始化  A[] a = new A[10];--引用常量(final类型)不会触发此类的初始化(常量在编译阶段就存入调用类的常量池中了)

3.类加载器的层次结构(树状结构)

引导类加载器(bootstrap class loader)c语言编写

--他用类加载java 的核心库(String 、Integer、List。。。)在jre/lib/rt.jar路径下的内容,是用C代码来实现的,并不继承自java.lang.ClassLoader。--加载扩展类和应用程序类加载器。并指定他们的父类加载器。

扩展类加载器(extensions class loader)

--用来加载java的扩展库(jre/ext/*.jar路径下的内容)java虚拟机的实现会自动提供一个扩展目录。该类加载器在此目录里面查找并加载java类。应用程序类加载器(application class loader)--他根据java应用的类路径(classpath路径),一般来说,java应用的类都是由他来完成加载的

自定义类加载器

--开发人员可以通过继承java.lang.ClassLoader类的方式实现自己的类加载器,以满足一些特殊的需求。

扩展类加载器、应用程序类加载器、自定义类加载器均是由java实现,都继承java.lang.ClassLoader类。

类加载器的代理模式:双亲委托机制

--就是某个特定的类加载器在接收到加载类的请求后,首先将加载任务委托给父类加载器,一次追溯,直到最高的爷爷辈的,如果父类加载器可以完成类加载任务,就成功返回;只要父类加载器无法完成次加载任务时,才自己加载。--双亲机制是为了保证java核心库的类型安全,不会出现用户自己能定义java.lang.Object类的情况。

双亲委托机制是代理模式的一种,并不是所有的类加载器都采用双亲委托机制,tomcat服务器类加载器也使用代理模式,所不同的是他是首先尝试自己去加载某个类,如果找不到在代理给父类加载器。

转载地址:http://www.cnblogs.com/pengfeiliu/p/4420793.html

java中类加载机制、类加载过程和类加载器层次相关推荐

  1. 高级开发必须理解的Java中SPI机制

    本文通过探析JDK提供的,在开源项目中比较常用的Java SPI机制,希望给大家在实际开发实践.学习开源项目提供参考. 1 SPI是什么 SPI全称Service Provider Interface ...

  2. 请说明一下JAVA中反射的实现过程和作用分别是什么?

    请说明一下JAVA中反射的实现过程和作用分别是什么? Java语言编译后形成.class文件,反射就是通过字节码文件找到一个类,类中的方法及属性等.反射的实现主要通过四个类 Class 类的对象 Co ...

  3. java socket分包粘包 代码_分享java中处理socket通信过程中粘包情况的实例代码

    本篇文章主要介绍了java中处理socket通信过程中粘包的情况,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 这两天学习了java中处理socket通信过程中粘包的情况,而且很重要,所以,今天添 ...

  4. Java虚拟机:对象创建过程与类加载机制、双亲委派模型

    一.对象的创建过程: 1.对象的创建过程: 对象的创建过程一般是从 new 指令(JVM层面)开始的,整个创建过程如下: (1)首先检查 new 指令的参数是否能在常量池中定位到一个类的符号引用: ( ...

  5. Java类的加载过程,类加载器,双亲委派原则

    Java一个类的加载过程: 1.加载 a.jvm会根据类名找到对应的类文件 b.进行文件内容读取 2.链接 链接主要是验证类中数据是否合法,然后把刚加载进来的类和其他类的关系建立清楚,主要有以下几个步 ...

  6. bootstraptable treeGrid 懒加载_Java类加载机制及自定义加载器

    一:ClassLoader类加载器,主要的作用是将class文件加载到jvm虚拟机中.jvm启动的时候,并不是一次性加载所有的类,而是根据需要动态去加载类,主要分为隐式加载和显示加载. 隐式加载:程序 ...

  7. 双亲委托类加载机制_图解JVM类加载机制和双亲委派模型

    我们都知道以 .java 结尾的 Java 源文件,经过编译之后会变成 .class 结尾的字节码文件.JVM 通过类加载器来加载字节码文件,然后再执行程序. 什么时候加载一个类 那么,什么时候类加载 ...

  8. 深入研究Java中一个对象的初始化过程

    在Java中要想实例化一个对象必须调用构造器,调用构造器这个类必须在jvm已经被加载了,在类加载和对象初始化的过程有些顺序问题是值得我们去留意的. 一个Java类中主要包含以下几部分: 静态代码块:在 ...

  9. 我崩溃了!月薪30K必须掌握的开源项目Java中SPI机制

    前言 Spring 是一个非常流行和成功的 Java 应用开发框架.Spring Security 是 Spring 家族中的一个安全管理框架,提供了一套 Web 应用安全性的完整解决方案.在用户认证 ...

  10. java中异常处理机制

    文章目录 一 认识常见异常 1 除0异常(算术异常) 2 数组越界异常 3 空指针异常 二 异常的体系 三 异常的用法(try-catch语句) 1概述与代码理解 2 注意事项 3 finally语句 ...

最新文章

  1. Selenium3.X 与 Javascript (Nodejs)
  2. nyoj983 首尾相连数组的最大子数组和
  3. jquery.uploadify参数
  4. 轻量小巧的Knife4j v2.0.8源码
  5. sobel prewitt算法 模板加权模糊的解释 + 两类边缘下的二阶导数值
  6. laravel自动建mysql索引_让 Laravel 优雅地创建 MySQL 全文索引
  7. https原理:证书传递、验证和数据加密、解密过程解析
  8. 【Docker】使用介绍
  9. ajax跨域.pdf,探秘ajax跨域请求.pdf
  10. android NDK 详解
  11. tsplay 打流,EasyICE测试
  12. “声波识别”可用于购物
  13. 简易电影售票系统(附部分总结)
  14. 机器学习实战应用案例100篇(十二)-樽海鞘算法从原理到实战应用案例
  15. toastr弹出提示窗口的使用
  16. vant 个人中心头像修改
  17. 计算机nie,聂眉宁-西南石油大学 - 计算机科学学院
  18. PHP smarty
  19. 计算机限制360打不开,电脑360浏览器打不开解决方法
  20. 计算机系统中所有实际物理装置的,计算机系统中所有实际物理装置的总称是计算机________件...

热门文章

  1. 机器学习 集成学习篇——python实现Bagging和AdaBOOST算法
  2. cmake (2)路径指令
  3. 数学建模——智能优化之遗传算法详解Python代码
  4. C语言中compile time assert的实现
  5. [ATF]-ATF makefile的导读
  6. [ARM-assembly]-A64的load/store指令总结
  7. Redis常见面试题及答案模板
  8. 【模拟】P1067 多项式输出
  9. linux编译llvm代码
  10. 2020-11-13(调用约定)