//TODO
1.分区
垃圾回收就是释放堆中的对象
堆中有两个区:新生代 老年代。
新生代GC,也叫Minor GC或者Young GC,指发生在新生代的垃圾回收动作,由于JAVA的大多数对象具有朝生夕灭的特性,因此这种GC发生的很频繁,回收速度也较快。
2.老年代GC,也叫Full GC或者Major GC,指发生在老年代的垃圾收集动作,速度一般比Minor GC慢10倍以上。
当Eden区没有足够的空间分配时,虚拟机会发起一次Minor GC,这里我们要知道的是新生区包括Eden区和一个Survivor区,但是是存在2个Survivor区的,2个Suivivor中必定有一个区是空的。因此新生代总的可用空间就是(Eden+1个Survivor)。如果分配时发现Eden区没有足够的内存,那么会发生一次Minor GC,这期间发生的动作会导致Eden区的对象进入一个Survivor区,如果虚拟机发现Eden区的对象太大以至于无法全部放入1个Survivor区,会通过分配担保机制提前将Eden区内的对象转移到老年代去。
大对象直接进入老年代:
因为新生代采用复制算法收集内存,因此大对象对于JVM是很苦恼的,尤其是当这些大对象很短命的时候,经常出现大对象容易导致内存还有不少空间时就提前出发垃圾收集以获取足够的连续空间来安置他们。
因此,当产生大对象时,会将其直接分配在老年代。
长期存活的对象将进入老年代:
虚拟机管理内存的思想是分代收集。每个对象定义了一个对象年龄计数器,当对象在Eden出生并经过第一次Minor GC后仍然存活,并且能被Survivor容纳的话,将被移动到Survivor中,并且其年龄被置为1,每度过一次GC(即每次从一个Survivor转移到另一个Survivor中),年龄增加1,当到达15岁时,晋升到老年代。15这个年龄值是可以人为改变的。但是并不是一定要到达年龄阀值时对象才会被转移到老年代,JVM中存在动态对象年龄判定来适应不同程序的内存状况。如果在Survivor空间中相同年龄的所有对象的大小总和大于Survivor空间的一半,这些对象可以提前直接进入老年代。
空间分配担保:
在发生Minor GC之前,JVM会先检查老年代最大可用的连续空间是否大于新生代所有对象的总空间,如果这个条件成立,那么Minor GC可以确保是安全的。如果不成立,会继续检查老年代最大可用连续空间是否大于历次晋升到老年代对象的平均大小,如果大于,尝试进行一次Minor GC;如果小于,那么不允许冒险,此时就需要进行一次Full GC来清理老年代。
jvm 参数
参数 | 说明 | 实例 |
---|---|---|
-Xms | 初始堆大小,默认物理内存的1/64 | -Xms512M |
-Xmx | 最大堆大小,默认物理内存的1/4 | -Xms2G |
-Xmn | 新生代内存大小,官方推荐为整个堆的3/8 | -Xmn512M |
-Xss | 线程堆栈大小,jdk1.5及之后默认1M,之前默认256k | -Xss512k |
-XX:NewRatio=n | 设置新生代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4 | -XX:NewRatio=3 |
-XX:SurvivorRatio=n | 年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:8,表示Eden:Survivor=8:1:1,一个Survivor区占整个年轻代的1/8 | -XX:SurvivorRatio=8 |
-XX:PermSize=n | 永久代初始值,默认为物理内存的1/64 | -XX:PermSize=128M |
-XX:MaxPermSize=n | 永久代最大值,默认为物理内存的1/4 | -XX:MaxPermSize=256M |
-verbose:class | 在控制台打印类加载信息 | |
-verbose:gc | 在控制台打印垃圾回收日志 | |
-XX:+PrintGC | 打印GC日志,内容简单 | |
-XX:+PrintGCDetails | 打印GC日志,内容详细 | |
-XX:+PrintGCDateStamps | 在GC日志中添加时间戳 | |
-Xloggc:filename | 指定gc日志路径 | -Xloggc:/data/jvm/gc.log |
-XX:+UseSerialGC | 年轻代设置串行收集器Serial | |
-XX:+UseParallelGC | 年轻代设置并行收集器Parallel Scavenge | |
-XX:ParallelGCThreads=n | 设置Parallel Scavenge收集时使用的CPU数。并行收集线程数。 | -XX:ParallelGCThreads=4 |
-XX:MaxGCPauseMillis=n | 设置Parallel Scavenge回收的最大时间(毫秒) | -XX:MaxGCPauseMillis=100 |
-XX:GCTimeRatio=n | 设置Parallel Scavenge垃圾回收时间占程序运行时间的百分比。公式为1/(1+n) | -XX:GCTimeRatio=19 |
-XX:+UseParallelOldGC | 设置老年代为并行收集器ParallelOld收集器 | |
-XX:+UseConcMarkSweepGC | 设置老年代并发收集器CMS | |
-XX:+CMSIncrementalMode | 设置CMS收集器为增量模式,适用于单CPU情况。 |