1.加载阶段:获取字节码二进制流,并将静态存储结构转化成方法区的运行时数据结构,且在方法区生成相应的类对象(java.lang.Class对象),作为该类的数据访问入口 。
2.连接阶段:该阶段包括三个小阶段,即验证,准备和解析三阶段
(1)验证:确保字节码文件符合虚拟机规范要求,如元数据验证,文件格式验证,字节码验证和符号验证等
(2)准备:为内的静态表里分配内存,并且设置jvm默认值,对于非静态变量,此阶段,不需分配内存 。
(3)解析:将常量池内的符号引用转化为直接引用
3.初始化阶段:类对象使用前的一些必要初始化工作
如下引用自一位博友的观点,个人认为解释得很好 。
在 Java 代码中,如果要初始化一个静态字段,我们可以在声明时直接赋值,也可以在静态代码块中对其赋值 。
除了 final static 修饰的常量,直接赋值操作以及所有静态代码块中的代码,则会被 Java 编译器置于同一方法中,并把它命名为 < clinit >。初始化的目的是是为标记为
常量值的字段赋值,以及执行< clinit > 方法的过程 。Java 虚拟机会通过加锁来确保类的 < clinit > 方法仅被执行一次 。
哪些条件会发生类初始化呢?
(1)当虚拟机启动时,初始化用户指定的主类(main函数);
(2)当遇到用于新建目标类实例的 new 指令时,初始化 new 指令的目标类;
(3)当遇到调用静态方法的指令时,初始化该静态方法所在的类;
(4)子类的初始化会触发父类的初始化;
(5)如果一个接口定义了 default 方法,那么直接实现或者间接实现该接口的类的初始化,会触发该接口的初始化;
(6)使用反射 API 对某个类进行反射调用时,初始化这个类;
(7)当初次调用 MethodHandle 实例时,初始化该 MethodHandle 指向的方法所在的类 。
4.使用阶段:jvm中使用对象
5.卸载阶段:将对象从jvm中卸载(unload),哪些条件会使jvm发生类卸载呢?
(1)加载该类的类加载器被回收
(2)该类的所有实例已经被回收
(3)该类对应的java.lang.Class对象没有任何地方被引用

文章插图
四 jvm内存模型1.JVM内存模型是怎样的?
如下为JVM内存模型架构图,由于在之前的文章中论述过,这里就不再一 一论述,主要讲解堆区 。

文章插图
在jdk 1.8前,堆区主要分为新生代、老年代和永久代 。jdk 1.8后,去掉了永久代,增加了MetaSpace区 。这里,主要分享jdk 1.8 。
根据jdk1.8,堆区逻辑抽象为三个部分:
(1)新生代:包括Eden区,S0区(也叫from区),S21(也叫TO区)
(2)老年代
(3)Metaspace区
2.新生代和老年代的内存大小是怎样的?
根据官方建议,新生代占三分之一(Eden:S0:S1=8:1:1),老年代占三分之二,因此内存分配图如下:

文章插图
3.GC回收是怎样进行的?
对象先在Eden区运行,当Eden内存用占用满时,Eden会进行两个操作:回收不用的对象和将未回收对象放入s0区,此时s0区和s1区互换名称,即s0->s1,s1->s0,Eden区经过一次对象回收后,释放了空间,当Eden下次再满时,执行相同步骤,依次循环执行,当Eden区回收后,剩下的对象超过s0容量,则将触发一次Minor GC,此时将未回收的对象放入老年区,依次循环执行,当Eden区触发Minor GC时,剩余的对象容量大于old区剩余容量时,则old区将触发一次Major GC,此时便会触发一次Full GC 。需要注意的是,一般发生Major GC,基本都都会伴随一次Full GC回收,Full GC非常损耗性能,在JVM调优时,要注意 。
下图我在生产环境截的一张GC图,监控工具VisualVM

文章插图
4.垃圾回收算法有哪些?
(1)标记-清除算法
该算法分为2个阶段,即标记阶段和清除阶段,首先标记所有要回收的对象,然后回收被标记的对象 。该算法效率低,且容易产生内存碎片 。
a.效率低:需要遍历两次内存,第一次标记,第二次回收被标记对象
b.由于是非连续内存片段,容易产生碎片,当对象过大时,容易发生Full GC
下图为标记-清除算法 回收前和回收后对比示意图

文章插图
推荐阅读
- 茶山揭秘系列之同庆河,中茶桐箐河同庆河享受稀缺的秘境野韵奇香
- 茶山揭秘系列之大安,古六大茶山古六大茶山系列之莽枝古树茶
- 茶山揭秘系列之曼夕,倚邦古茶山
- 太极初学者学习老架二路拳的意义
- 初学者练习太极必须要注意这五点
- 初学者力量训练计划有什么
- 初学者学的瑜伽注意什么?
- 初学者学哪种瑜伽比较好呢?
- 瑜伽初学者的动作怎么做呢?
- 初学者瘦身瑜伽要怎么做?
