JVM G1参数
发布网友
发布时间:2022-11-10 07:40
我来回答
共1个回答
热心网友
时间:2023-11-24 05:00
采用根搜索算法,通过一系列名为”GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。
1. 栈中引⽤的对象
2. 静态变量、常量引⽤的对象
3. 本地⽅法栈native⽅法引⽤的对象
1.标记-复制
2.标记-清理
3.标记-整理
G1采取了不同的策略来解决并行、串行和CMS收集器的碎片、暂停时间不可控制等问题
G1会优先回收垃圾对象特别多的分区,这样可以花费较少的时间来回收这些分区的垃圾
在年轻代回收期间,G1 GC 会调整其年轻代空间(eden 和存活空间大小)以满足目标。
在混合回收期间,G1 GC 会根据混合垃圾回收的目标次数调整所回收的年老代区域数量,并调整堆的每个区域中存活对象的百分比,以及总体可接受的堆废物百分比。
G1算法将堆划分为若干个区域(Region), 每个region可以是edon, survior, old区域,每个region大小相同为1M, 2M, 4M 2的幂次方大小,整个堆中默认有2048个region,每个Region默认按照512Kb划分成多个Card。
如果一个对象占用的空间大于一个region尺寸的一半,就会专门放入到humongous区域。G1划分了一个Humongous区,它用来专门存放巨型对象。如果一个H区装不下一个巨型对象,那么G1会寻找连续的H分区来存储。为了能找到连续的H区,有时候不得不启动Full GC。这种情况可以调整整个堆的大小,或者调整G1HeapRegionSize大小。
Remembered Set ,对应于一个region,采用point-in策略,记录该region中某card被其它region 的引用情况。RSet其实是一个Hash Table,Key是别的Region的起始地址,Value是一个集合,里面的元素是Card Table的Index。 进行垃圾回收时,如果Region1有根对象A引用了Region2的对象B,显然对象B是活的,如果没有Rset,就需要扫描整个Region1或者其它Region,才能确定对象B是活跃的,有了Rset可以避免对整个堆进行扫描。
cms中年老代也有rset,采用point-out策略,记录年老代中引用年轻代的对象,这样在ygc时就不用扫描整个年老代,只扫描年老代的rset。
G1MaxNewSizePercent 新生代最大值,默认值60%
G1MaxPauseTime 设置G1收集过程目标时间,默认值200ms
G1ReservePercent 预留百分之多少内存,防止晋升失败的情况,默认值是10
-XX:InitiatingHeapOccupancyPercent=45 – 整个堆栈使用达到百分之多少的时候,启动GC周期. 基于整个堆,不仅仅是其中的某个代的占用情况,G1根据这个值来判断是否要触发GC周期, 0表示一直都在GC,默认值是45(即45%满了,或者说占用了),启动mix gc
MaxRAMPercentage、InitialRAMPercentage、MinRAMPercentage 应用于docker容器中,根据docker容器内存大小指定堆的初始,最大,最小比例
ParallelRefProcEnabled 默认为false,并行的处理Reference对象,如WeakReference,除非在GC log里出现Reference处理时间较长的日志,否则效果不会很明显
显式的使用-Xmn设置年轻代的大小,会干预G1的默认行为。
G1就不会再考虑设定的暂停时间目标,所以本质上说,设定了年轻代大小就相当于禁用了目标暂停时间。
G1就无法根据需要增大或者缩小年轻代的小心。既然大小固定了,就无法在大小上做任何改变了。
为了避免堆内存被耗尽,虚拟机会触发一个混合的垃圾收集器,即mixed gc
除了回收整个young region,还会回收一部分的old region
主要分为以下几个步骤:
1. initial mark: 初始标记过程,整个过程STW,标记了从GC Root可达的对象
2. concurrent marking: 并发标记过程,整个过程gc collector线程与应用线程可以并行执行,标记出GC Root可达对象衍生出去的存活对象,并收集各个Region的存活对象信息
3. remark: 最终标记过程,整个过程STW,标记出那些在并发标记过程中遗漏的,或者内部引用发生变化的对象
4. clean up: 垃圾清除过程,如果发现一个Region中没有存活对象,则把该Region加入到空闲列表中
使用范围不一样
CMS收集器是老年代的收集器,可以配合新生代的Serial和ParNew收集器一起使用
G1收集器收集范围是老年代和新生代
STW的时间
CMS收集器以最小的停顿时间为目标的收集器。
G1收集器可预测垃圾回收的停顿时间(建立可预测的停顿时间模型)
垃圾碎片
CMS收集器是使用“标记-清除”算法进行的垃圾回收,容易产生内存碎片
G1收集器使用的是“标记-整理”算法,进行了空间整合,降低了内存空间碎片
参考: https://www.jianshu.com/p/a3e6a9de7a5d
https://blog.csdn.net/u013380694/article/details/83341913
https://www.jianshu.com/p/ab54489f5d71?u_atoken=ca2d26ce-15a4-462b-9ee2-1d3dfca2d647&u_asession=01o91Z6M5SGuri8DAWL30xCUqcrFLi-kRD0-eOdne8XcfWhUbbJUSLGdkUER_tKV6ZX0KNBwm7Lovlpxjd_P_q4JsKWYrT3W_NKPr8w6oU7K9iRp8G_FBmi6Pj9SvVQQGhPpcarp92QKzyJKyYjREPlmBkFo3NEHBv0PZUm6pbxQU&u_asig=05wanIMMdgd47zVbFsycM4G3XiEWJOwnlBIedkc2SHAPEpD2_7vZwmCUEmowKET9soS-B3_YnquxJK1II_ufphdjR9EF5W4qBzbaQxa_DPpZ9KH_WWrcZkPnxOvsCZ39BhM8IrlznNwQ0UdcEEnqYpJeA7kV8xID-QE6N5IgXkZa79JS7q8ZD7Xtz2Ly-b0kmuyAKRFSVJkkdwVUnyHAIJzWGO6WuFWykqWadjrTYuDDlsepUSqnt1DPsu3oCQAS-WWPRPQyB_SKrj-61LB_f61u3h9VXwMyh6PgyDIVSG1W_sAjQ4f8f4yq0uqSzEZWJ75oMI4nT4HpKECo0exjcvsBtcqfKGjRA1xEkYqHbRvn5t3_la6lRJ-YPuMiqQMnxZmWspDxyAEEo4kbsryBKb9Q&u_aref=npKvxxWi1kDXXuw5mG2TYBN3CXA%3D
热心网友
时间:2023-11-24 05:00
采用根搜索算法,通过一系列名为”GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。
1. 栈中引⽤的对象
2. 静态变量、常量引⽤的对象
3. 本地⽅法栈native⽅法引⽤的对象
1.标记-复制
2.标记-清理
3.标记-整理
G1采取了不同的策略来解决并行、串行和CMS收集器的碎片、暂停时间不可控制等问题
G1会优先回收垃圾对象特别多的分区,这样可以花费较少的时间来回收这些分区的垃圾
在年轻代回收期间,G1 GC 会调整其年轻代空间(eden 和存活空间大小)以满足目标。
在混合回收期间,G1 GC 会根据混合垃圾回收的目标次数调整所回收的年老代区域数量,并调整堆的每个区域中存活对象的百分比,以及总体可接受的堆废物百分比。
G1算法将堆划分为若干个区域(Region), 每个region可以是edon, survior, old区域,每个region大小相同为1M, 2M, 4M 2的幂次方大小,整个堆中默认有2048个region,每个Region默认按照512Kb划分成多个Card。
如果一个对象占用的空间大于一个region尺寸的一半,就会专门放入到humongous区域。G1划分了一个Humongous区,它用来专门存放巨型对象。如果一个H区装不下一个巨型对象,那么G1会寻找连续的H分区来存储。为了能找到连续的H区,有时候不得不启动Full GC。这种情况可以调整整个堆的大小,或者调整G1HeapRegionSize大小。
Remembered Set ,对应于一个region,采用point-in策略,记录该region中某card被其它region 的引用情况。RSet其实是一个Hash Table,Key是别的Region的起始地址,Value是一个集合,里面的元素是Card Table的Index。 进行垃圾回收时,如果Region1有根对象A引用了Region2的对象B,显然对象B是活的,如果没有Rset,就需要扫描整个Region1或者其它Region,才能确定对象B是活跃的,有了Rset可以避免对整个堆进行扫描。
cms中年老代也有rset,采用point-out策略,记录年老代中引用年轻代的对象,这样在ygc时就不用扫描整个年老代,只扫描年老代的rset。
G1MaxNewSizePercent 新生代最大值,默认值60%
G1MaxPauseTime 设置G1收集过程目标时间,默认值200ms
G1ReservePercent 预留百分之多少内存,防止晋升失败的情况,默认值是10
-XX:InitiatingHeapOccupancyPercent=45 – 整个堆栈使用达到百分之多少的时候,启动GC周期. 基于整个堆,不仅仅是其中的某个代的占用情况,G1根据这个值来判断是否要触发GC周期, 0表示一直都在GC,默认值是45(即45%满了,或者说占用了),启动mix gc
MaxRAMPercentage、InitialRAMPercentage、MinRAMPercentage 应用于docker容器中,根据docker容器内存大小指定堆的初始,最大,最小比例
ParallelRefProcEnabled 默认为false,并行的处理Reference对象,如WeakReference,除非在GC log里出现Reference处理时间较长的日志,否则效果不会很明显
显式的使用-Xmn设置年轻代的大小,会干预G1的默认行为。
G1就不会再考虑设定的暂停时间目标,所以本质上说,设定了年轻代大小就相当于禁用了目标暂停时间。
G1就无法根据需要增大或者缩小年轻代的小心。既然大小固定了,就无法在大小上做任何改变了。
为了避免堆内存被耗尽,虚拟机会触发一个混合的垃圾收集器,即mixed gc
除了回收整个young region,还会回收一部分的old region
主要分为以下几个步骤:
1. initial mark: 初始标记过程,整个过程STW,标记了从GC Root可达的对象
2. concurrent marking: 并发标记过程,整个过程gc collector线程与应用线程可以并行执行,标记出GC Root可达对象衍生出去的存活对象,并收集各个Region的存活对象信息
3. remark: 最终标记过程,整个过程STW,标记出那些在并发标记过程中遗漏的,或者内部引用发生变化的对象
4. clean up: 垃圾清除过程,如果发现一个Region中没有存活对象,则把该Region加入到空闲列表中
使用范围不一样
CMS收集器是老年代的收集器,可以配合新生代的Serial和ParNew收集器一起使用
G1收集器收集范围是老年代和新生代
STW的时间
CMS收集器以最小的停顿时间为目标的收集器。
G1收集器可预测垃圾回收的停顿时间(建立可预测的停顿时间模型)
垃圾碎片
CMS收集器是使用“标记-清除”算法进行的垃圾回收,容易产生内存碎片
G1收集器使用的是“标记-整理”算法,进行了空间整合,降低了内存空间碎片
参考: https://www.jianshu.com/p/a3e6a9de7a5d
https://blog.csdn.net/u013380694/article/details/83341913
https://www.jianshu.com/p/ab54489f5d71?u_atoken=ca2d26ce-15a4-462b-9ee2-1d3dfca2d647&u_asession=01o91Z6M5SGuri8DAWL30xCUqcrFLi-kRD0-eOdne8XcfWhUbbJUSLGdkUER_tKV6ZX0KNBwm7Lovlpxjd_P_q4JsKWYrT3W_NKPr8w6oU7K9iRp8G_FBmi6Pj9SvVQQGhPpcarp92QKzyJKyYjREPlmBkFo3NEHBv0PZUm6pbxQU&u_asig=05wanIMMdgd47zVbFsycM4G3XiEWJOwnlBIedkc2SHAPEpD2_7vZwmCUEmowKET9soS-B3_YnquxJK1II_ufphdjR9EF5W4qBzbaQxa_DPpZ9KH_WWrcZkPnxOvsCZ39BhM8IrlznNwQ0UdcEEnqYpJeA7kV8xID-QE6N5IgXkZa79JS7q8ZD7Xtz2Ly-b0kmuyAKRFSVJkkdwVUnyHAIJzWGO6WuFWykqWadjrTYuDDlsepUSqnt1DPsu3oCQAS-WWPRPQyB_SKrj-61LB_f61u3h9VXwMyh6PgyDIVSG1W_sAjQ4f8f4yq0uqSzEZWJ75oMI4nT4HpKECo0exjcvsBtcqfKGjRA1xEkYqHbRvn5t3_la6lRJ-YPuMiqQMnxZmWspDxyAEEo4kbsryBKb9Q&u_aref=npKvxxWi1kDXXuw5mG2TYBN3CXA%3D