假设你是一个普通的 Java 对象,你出生在 Eden 区,在 Eden 区有许多和你差很少的小兄弟、小姐妹,能够把 Eden 区当成幼儿园,在这个幼儿园里你们玩了很长时间。Eden 区不能无休止地放大家在里面,因此当年纪稍大,你就要被送到学校去上学,这里假设从小学到高中都称为 Survivor 区。开始的时候你在 Survivor 区里面划分出来的的“From”区,读到高年级了,就进了 Survivor 区的“To”区,中间因为学习成绩不稳定,还常常来回折腾。直到你 18 岁的时候,高中毕业了,该去社会上闯闯了。因而你就去了年老代,年老代里面人也不少。在年老代里,你生活了 20 年 (每次 GC 加一岁),最后寿终正寝,被 GC 回收。有一点没有提,你在年老代遇到了一个同窗,他的名字叫爱德华 (慕光之城里的帅哥吸血鬼),他以及他的家族永远不会死,那么他们就生活在永生代html
GC 命令行选项 描述java
id | name |
---|---|
-Xms | 设置Java堆大小的初始值/最小值。例如:-Xms512m (请注意这里没有”=”) |
-Xmx | 设置Java堆大小的最大值 |
-Xmn | 设置年轻代对空间的初始值,最小值和最大值。请注意,年老代堆空间大小是依赖于年轻代堆空间大小的 |
-XX:PermSize=[g/m/k] | 设置持久代堆空间的初始值和最小值 |
-XX:MaxPermSize=[g/m/k] | 设置持久代堆空间的最大值 |
### 如何将新对象预留在年轻代学习
-XX:+PrintGCDetails -Xmx1000M -Xms500M -Xmn100M -XX:SurvivorRatio=8 设置一个较大的年轻代预留新对象,设置合理的 Survivor 区而且提供 Survivor 区的使用率,能够将年轻对象保存在年轻代。通常来讲,Survivor 区的空间不够,或者占用量达到 50%时,就会使对象进入年老代 (无论它的年龄有多大)url
-XX:TargetSurvivorRatio=90 参数,这样能够提升 from 区的利用率,使 from 区使用到 90%时,再将对象送入年老代spa
让大对象进入年老代
参数-XX:PetenureSizeThreshold 设置大对象直接进入年老代的阈值。当对象的大小超过这个值时,将直接在年老代分配。参数-XX:PetenureSizeThreshold 只对串行收集器和年轻代并行收集器有效,并行回收收集器不识别这个参数。.net
将 1MB 以上的对象直接在年老代分配,设置-XX:PetenureSizeThreshold=1000000命令行
设置对象进入年老代的年龄
若是对象每通过一次 GC 依然存活,则年龄再加 1。当对象年龄达到阈值时,就移入年老代,成为老年对象。这个阈值的最大值能够经过参数-XX:MaxTenuringThreshold 来设置,默认值是 15。虽然-XX:MaxTenuringThreshold 的值多是 15 或者更大,但这不意味着新对象非要达到这个年龄才能进入年老代。线程
-XX:+PrintGCDetails -Xmx20M -Xms20M -Xmn10M -XX:SurvivorRatio=2 -XX:MaxTenuringThreshold=1htm
### 稳定的 Java 堆 VS 动荡的 Java 堆 得到一个稳定的堆大小的方法是使-Xms 和-Xmx 的大小一致,即最大堆和最小堆 (初始堆) 同样。对象
JVM 还提供了两个参数用于压缩和扩展堆空间。
-XX:MinHeapFreeRatio 参数用来设置堆空间最小空闲比例,默认值是 40。当堆空间的空闲内存小于这个数值时,JVM 便会扩展堆空间。
-XX:MaxHeapFreeRatio 参数用来设置堆空间最大空闲比例,默认值是 70。当堆空间的空闲内存大于这个数值时,便会压缩堆空间,获得一个较小的堆。
当-Xmx 和-Xms 相等时,-XX:MinHeapFreeRatio 和-XX:MaxHeapFreeRatio 两个参数无效。
-XX:+PrintGCDetails -Xms10M -Xmx40M -XX:MinHeapFreeRatio=40 -XX:MaxHeapFreeRatio=50
java –Xmx3800m –Xms3800m –Xmn2G –Xss128k –XX:+UseParallelGC –XX:ParallelGC-Threads=20 –XX:+UseParallelOldGC -Xss128k:减小线程栈的大小,这样能够使剩余的系统内存支持更多的线程;
-Xmn2g:设置年轻代区域大小为 2GB;
–XX:+UseParallelGC:年轻代使用并行垃圾回收收集器。这是一个关注吞吐量的收集器,能够尽量地减小 GC 时间。
–XX:ParallelGC-Threads:设置用于垃圾回收的线程数,一般状况下,能够设置和 CPU 数量相等。但在 CPU 数量比较多的状况下,设置相对较小的数值也是合理的;
–XX:+UseParallelOldGC:设置年老代使用并行回收收集器。
java –Xmx3550m –Xms3550m –Xmn2g –Xss128k –XX:ParallelGCThreads=20 –XX:+UseConcMarkSweepGC –XX:+UseParNewGC –XX:+SurvivorRatio=8 –XX:TargetSurvivorRatio=90 –XX:MaxTenuringThreshold=31
–XX:ParallelGCThreads=20:设置 20 个线程进行垃圾回收;
–XX:+UseParNewGC:年轻代使用并行回收器;
–XX:+UseConcMarkSweepGC:年老代使用 CMS 收集器下降停顿;
–XX:+SurvivorRatio:设置 Eden 区和 Survivor 区的比例为 8:1。稍大的 Survivor 空间能够提升在年轻代回收生命周期较短的对象的可能性,若是 Survivor 不够大,一些短命的对象可能直接进入年老代,这对系统来讲是不利的。
–XX:TargetSurvivorRatio=90:设置 Survivor 区的可以使用率。这里设置为 90%,则容许 90%的 Survivor 空间被使用。默认值是 50%。故该设置提升了 Survivor 区的使用率。当存放的对象超过这个百分比,则对象会向年老代压缩。所以,这个选项更有助于将对象留在年轻代。
–XX:MaxTenuringThreshold:设置年轻对象晋升到年老代的年龄。默认值是 15 次,即对象通过 15 次 Minor GC 依然存活,则进入年老代。这里设置为 31,目的是让对象尽量地保存在年轻代区域。