java虚拟机的垃圾回收机制原理
Posted 我_会飞的鱼
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java虚拟机的垃圾回收机制原理相关的知识,希望对你有一定的参考价值。
1.常用的算法:
a.引用计数法:为每一个对象配置一个整形计数器,当有一个引用时,计数器+1,引用失效时,计数器-1.计数器为0,进行垃圾回收
存在的问题:A对象引用B,B对象引用A.循环引用,无法清除,引起内存泄漏
java的垃圾回收器没有使用该算法
b.标记-清除算法
分标记阶段和清除阶段.
存在问题:释放后的空间不是连续的.内存分配不连续的空间,工作效率较低
c.复制算法
将内存空间分为两块,每次只使用其中一块,垃圾回收时,将正在使用的内存中存活的对象复制到未使用的内存中,然后,清除使用的内存的所有对象.
分析:可以保证回收后的内存空间没有碎片.当内存中有大量垃圾对象时,复制算法的效率很高,但存在大量存活对象时,效率低下.适用于年轻代
d.标记-压缩算法
对标记-清除算法的优化,清除时,将存活的对象压缩到内存的一端,清除边界外的所有空间,避免产生碎片
e.增量算法
垃圾回收的过程中,其他线程都会挂起,增量算法的思想是每次回收一小片区域的内存空间,和应用程序交替进行,
分析:应用程序一次性停顿时间少,但切换浪费时间,停顿次数增加.系统吞吐量下降
f.分代
分为年轻代内存空间,老年代内存,年轻代使用复制算法,老年代使用标记-压缩算法
JVM中的垃圾回收器分类
1.新生代串行收集器:单线程,独占式.使用复制算法.新生代分为 eden 空间、from 空间、to 空间 3 个部分。其中 from 空间和 to 空间可以视为用于复制的两块大小相同、地位相等,且可进行角色互换的空间块。from 和 to 空间也称为 survivor 空间,即幸存者空间,用于存放未被回收的对象。
2.老年代串行收集器:单线程,独占式.使用标记压缩算法
3.并行收集器:工作在新生代的垃圾回收 多线程,独占.可以指定线程个数
4.新生代并行回收收集器:和新生代并行收集器的区别:注重系统吞吐量,可设置最大停顿时间和吞吐量大小
5.老年代并行回收收集器:多线程.使用标记-压缩算法.
6.CMS收集器:标记-清除算法.不是独占式的.垃圾回收过程中可以运行程序.关注系统停顿时间.可以设置内存整理的时机
7.G1收集器:作为一款服务器的垃圾收集器,因此,它在吞吐量和停顿控制上,预期要优于 CMS 收集器。使用标记-压缩算法.可以控制停顿时间
总结:
GC 相关参数总结
1. 与串行回收器相关的参数
-XX:+UseSerialGC:在新生代和老年代使用串行回收器。
-XX:+SuivivorRatio:设置 eden 区大小和 survivor 区大小的比例。
-XX:+PretenureSizeThreshold:设置大对象直接进入老年代的阈值。当对象的大小超过这个值时,将直接在老年代分配。
-XX:MaxTenuringThreshold:设置对象进入老年代的年龄的最大值。每一次 Minor GC 后,对象年龄就加 1。任 何大于这个年龄的对象,一定会进入老年代。
2. 与并行 GC 相关的参数
-XX:+UseParNewGC: 在新生代使用并行收集器。
-XX:+UseParallelOldGC: 老年代使用并行回收收集器。
-XX:ParallelGCThreads:设置用于垃圾回收的线程数。通常情况下可以和 CPU 数量相等。但在 CPU 数量比较多的情况下,设置相对较小的数值也是合理的。
-XX:MaxGCPauseMills:设置最大垃圾收集停顿时间。它的值是一个大于 0 的整数。收集器在工作时,会调整 Java 堆大小或者其他一些参数,尽可能地把停顿时间控制在 MaxGCPauseMills 以内。
-XX:GCTimeRatio:设置吞吐量大小,它的值是一个 0-100 之间的整数。假设 GCTimeRatio 的值为 n,那么系统将花费不超过 1/(1+n) 的时间用于垃圾收集。
-XX:+UseAdaptiveSizePolicy:打开自适应 GC 策略。在这种模式下,新生代的大小,eden 和 survivor 的比例、晋升老年代的对象年龄等参数会被自动调整,以达到在堆大小、吞吐量和停顿时间之间的平衡点。
3. 与 CMS 回收器相关的参数
-XX:+UseConcMarkSweepGC: 新生代使用并行收集器,老年代使用 CMS+串行收集器。
-XX:+ParallelCMSThreads: 设定 CMS 的线程数量。
-XX:+CMSInitiatingOccupancyFraction:设置 CMS 收集器在老年代空间被使用多少后触发,默认为 68%。
-XX:+UseFullGCsBeforeCompaction:设定进行多少次 CMS 垃圾回收后,进行一次内存压缩。
-XX:+CMSClassUnloadingEnabled:允许对类元数据进行回收。
-XX:+CMSParallelRemarkEndable:启用并行重标记。
-XX:CMSInitatingPermOccupancyFraction:当永久区占用率达到这一百分比后,启动 CMS 回收 (前提是 -XX:+CMSClassUnloadingEnabled 激活了)。
-XX:UseCMSInitatingOccupancyOnly:表示只在到达阈值的时候,才进行 CMS 回收。
-XX:+CMSIncrementalMode:使用增量模式,比较适合单 CPU。
4. 与 G1 回收器相关的参数
-XX:+UseG1GC:使用 G1 回收器。
-XX:+UnlockExperimentalVMOptions:允许使用实验性参数。
-XX:+MaxGCPauseMills:设置最大垃圾收集停顿时间。
-XX:+GCPauseIntervalMills:设置停顿间隔时间。
5. 其他参数
-XX:+DisableExplicitGC: 禁用显示 GC。
优化都是根据自己程序的设计.没有固定的优化方案
以上是关于java虚拟机的垃圾回收机制原理的主要内容,如果未能解决你的问题,请参考以下文章
Java 虚拟机原理垃圾回收算法 ( Java 虚拟机内存分区 | 垃圾回收机制 | 引用计数器算法 | 引用计数循环引用弊端 )