- 看了网上关于类加载 虚拟机 这一块的东西 想写一点总结。
- 类加载的过程:从硬盘加载.class 文件到内存中(只要符合.class 文件格式 不管文件正确与否)—>检查(检查文件的正确性)—–>准备(给类中静态块分配内存)——>解析(将符号引用替换为 直接引用)—–>初始化(初始化静态变量,静态代码块 要说的是 如果存在直接父类那么首先得初始化父类之后再初始化子类中的初始化语句)。
- 多说一句Class.forName(“”)这段代码其实就是上述过程”加载并初始化”
-
- 准备阶段和初始化阶段看似有点牟盾,其实是不牟盾的,如果类中有语句:private static int a = 10,它的执行过程是这样的,首先字节码文件被加载到内存后,先进行链
- 接的验证这一步骤,验证通过后准备阶段,给a分配内存,因为变量a是static的,所以此时a等于int类型的默认初始值0,即a=0,然后到解析,到初始化这一步骤时,才把a的真正的值10赋给a,此时a=10。
-
- 类加载其实是动态加载的。他总是先把保证程序运行起来的基类加载,其他的等到jvm用到的时候再加载。
类加载器:三种1、 跟加载器Bootstrap—>加载jre/lib/rt.jar基础类库 中的.class 2、扩展加载器Extension —–>加载jre/lib/*jar的.class文件 3、应用程序加载器 —->负责记载classpath中指定的jar包及目录中class(其实还可以自己定义类加载器 这里就不说了)
- 现在 你可以绞尽脑汁想一想 在什么时候会有一个类的初始化?
- 1.new 一个新对象的时候 肯定会有类的初始化
- 2.在一个类中调用另外一个类的静态 方法
- 3.访问某个类的静态变量,或者对静态变量赋值。
- 4 反射(现在我也还没看过O(∩_∩)O哈哈~)即Class.forName(“全限定名”)会有类得初始化。
- 5初始化一个类的子类
- 6 jvm 启动时表明的启动类,即文件名 和类名相同的那个类。
-
- *
- 到现在为止你已经对类加载 的知识有个大致轮廓。下面细化一下
-
- 类加载后 是加载到在到内存中,那么加载到内存中的哪个区呢?其实是方法区,并且在堆区 生成了 对应的Class对象。Class对象封装了类在方法区内的数据结构,
并且向Java程序员提供了访问方法区内的数据结构的接口。额 就这一句话 O(∩_∩)O哈哈~ 细化完了
- 类加载后 是加载到在到内存中,那么加载到内存中的哪个区呢?其实是方法区,并且在堆区 生成了 对应的Class对象。Class对象封装了类在方法区内的数据结构,
类加载的过程(详细)
最新推荐文章于 2022-02-20 22:14:01 发布