JVM相关知识点总结

JVM相关知识点总结

1. JVM内存结构和管理机制

  1. 程序计数器:每个线程拥有一个PC寄存器,在线程创建时创建。指向下一条指令的地址。执行本地方法时,PC值为undefined。
  2. 方法区:保存装载类的信息;类型的常量池;字段,方法信息;方法字节码。
  3. 堆内存:new的对象都保存在Java堆中;所有的线程共享Java堆;对分代GC来说,堆也是分代的;GC管理的主要区域。
  4. 栈内存:线程私有,生命周期和线程相同;栈由一系列帧组成;帧保存一个方法的局部变量、操作数栈、常量池指针;每一个方法调用创建一个帧,并压入栈。
  5. 本地方法栈:保存native方法进入区域的地址。用于支持native方法的执行,存储每个native方法调用的状态。

2. JVM生命周期

JVM实例的诞生:

当启动一个Java程序时,一个JVM实例就产生了,任何一个拥有public static void main(String[] args) 函数的class都可以作为JVM实例运行的起点。

JVM实例的运行:

main()作为该程序初始线程的起点,任何其他线程均由该线程启动。JVM内部都有两种线程:守护线程和非守护线程,main()属于非守护线程,守护线程通常由JVM自己使用。Java程序可以表明自己创建的线程为守护线程。

JVM实例的消亡:

当程序中的所有非守护线程都终止时,JVM才退出;若安全管理器允许,程序也可以java.lang.Runtime类或者java.lang.System.exit()来退出。

3. JVM垃圾回收机制

首先判断GC在什么时候触发,其次判断对象是否存活,最后使用对应的垃圾回收算法回收垃圾。

GC在什么时候触发:

GC在优先级最低的线程中运行,一般在应用程序空闲时被调用。当内存不足时才会主动调用。

因为对象进行了分代处理,因此垃圾回收区域、时间也不一样。GC有如下两种:

  1. Young GC:一般情况下在年轻代尝试对象的分配,如果对象分配失败,就触发一次Young GC。
  2. Full GC:对整个内存进行整理,包括年轻代、老年代和永久代,所以Full GC比Young GC要慢, 因此应该尽量减少Full GC的次数。

判断对象是否存活:

  1. 引用计数法:堆中没创建一个对象,就都会为该对象创建一个计数器,默认初始值为1。当有其他变量被赋值为该对象的引用时,数值加1。当一个对象实例的引用死亡或被赋值新值时,计数器减1。
  2. 可达性分析算法:从GcRoot开始,寻找对应的引用节点,找到后继续寻找这个节点的引用结点,当所有引用节点寻找完毕后,剩余的节点就被认为是没有被引用的节点,即无用节点,无用节点被判定为可回收对象。

Java中可以作为GcRoot的包括下面几种:

  1. 虚拟机栈中引用的对象
  2. 方法区中类静态属性引用的对象
  3. 方法区中常量引用的对象
  4. 本地方法栈中应用的对象

常用的垃圾回收算法:

  1. 标记-清除法:从GcRoot开始搜描,对存活的对象进行标记。标记完后,再扫描整个空间中未被标记的对象,进行垃圾回收。该方法容易造成内存碎片。
  2. 标记-整理算法:该算法与标记-清除算法一样,但是在完成标记后,不直接清理可回收对象,而是将存活对象全部向一端移动,接着清理掉边界以外的内存。
  3. 标记-复制算法:它将内存划分为大小相等的两块,每次只使用其中的一块。当这A快内存用完了,就将还存活的对象复制到B块上面,然后把A块的内存空间一次性清理掉。这种算法虽然实现简单,运行高效且不易产生内存碎片,但是却对内存空间的使用做出了高昂的代价,因为能使用的空间缩减为原来的一半。很显然,复制算法的效率跟存活对象的数量有很大关联,若存活对象很多,那么效率将大大降低。
  4. 分代收集算法:分代收集算法是目前大部分JVM的垃圾收集器采用的算法。其核心思想是根据对象存活的生命周期将内存划分为若干个不同的区域。将其分为年轻代、老年代和永久代。然后根据不同的区域采用合适的收集算法。

4. 常见的垃圾收集器

CMS收集器(标记-清除算法)

CMS收集过程:

  1. 初始标记(CMS-initial-mark) ,会导致stw;
  2. 并发标记(CMS-concurrent-mark),与用户线程同时运行;
  3. 预清理(CMS-concurrent-preclean),与用户线程同时运行;
  4. 可被终止的预清理(CMS-concurrent-abortable-preclean) 与用户线程同时运行;
  5. 重新标记(CMS-remark) ,会导致swt;
  6. 并发清除(CMS-concurrent-sweep),与用户线程同时运行;
  7. 并发重置状态等待下次CMS的触发(CMS-concurrent-reset),与用户线程同时运行;

G1收集器

G1 (Garbage-First)是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器. 以极高概率满足GC停顿时间要求的同时,还具备高吞吐量性能特征.。在Oracle JDK 7 update 4 及以上版本中得到完全支持, 专为以下应用程序设计:

  1. 可以像CMS收集器一样,GC操作与应用的线程一起并发执行。
  2. 紧凑的空闲内存区间且没有很长的GC停顿时间。
  3. 需要可预测的GC暂停耗时。
  4. 不想牺牲太多吞吐量性能。
  5. 启动后不需要请求更大的Java堆。
发布了17 篇原创文章 · 获赞 1 · 访问量 3411

猜你喜欢

转载自blog.csdn.net/ZeroWdd/article/details/104815657