HIT软件构造 JVM垃圾回收
JVM内存的结构
下面这张图是对jvm内存的额一个比较详细的解释
- 所有的内存分成三部分:新生代,旧生代,永久区(meta space)
- 新生代又分为eden,from,to三个部分
- 所有的allocated对象最开始是直接分配在eden中
- YGC之后(eden空间不足),所有的object转移到from区
- from和to之间进行n次交换(复制方法)
- to中存留下来的进入老年代
- 在静态域中存储的是静态变量和类信息
垃圾回收策略
算法基本思想
基本思想:针对不同的区域,使用不同的GC策略
针对年轻代:只有一小部分对象可较长时间 存活,故采用copy算法减少GC代价
针对年老代:这里的对象有很高的幸存度,使 用Mark-Sweep或Mark-Compact算法
多种GC的说法
- minor GC:针对young generation(eden),使用minor GC进行垃圾收集
Minor GC所需时间较短 – Objects that remain live for some number of minor - full GC:如果old generation满了,则启动full GC
Old generation满,意味着无法进行下一次minor GC
注: - 当perm generation满了之后,无 法存储更多的元数据,也启动full GC
- minorGC仅仅由eden区触发,但是进行整理的不仅仅是eden区,还有from和to,甚至还有old generation
JVM的优化
- 优化虚拟机堆的大小
较大的heap会导致较少发生GC,但每次GC时间很长
较小的heap,则需要频繁GC,但每次GC的时间较短
-Xms(年轻代+老年代的最小尺寸)
-Xmx(年轻代+老年代的最大尺寸)
-XX:MetaspaceSize(静态域的最小尺寸)
-XX:MaxMetaspaceSize(静态域的最大尺寸)
-XX:NewSize(年轻代的最小尺寸)
-XX:MaxNewSize(年轻代的最大尺寸)
-XX:NewRatio(新生代和老年代的比例是1:n)
-XX:SurvivorRatio(eden和survivor的比例是n:1)
-XX:MinHeapFreeRatio(堆的最小空闲比例)
-XX:MaxHeapFreeRatio(堆的最大空闲比例) - 选择一个垃圾回收方案
-XX:+UseSerialGC (使用一个线程进行垃圾回收工作,它在工作时,冻结所有应用程序,也叫串行收集器)
-XX:+UseParallelGC -XX:ParallelGCThreads=n (并行地执行minorGC,这样可以大大地减少开销;但是fullGC是在单一的线程中执行的。执行的时候会中止应用程序)
-XX:+UseParallelOldGC(使用多线程进行年轻代和老年代的垃圾回收)
-XX:+UseConcMarkSweepGC -XX:ParallelCMSThreads=n(并发地进行垃圾回收,并且只暂停很少的时间)
–XX:+UseG1GC(对于一个空间大于4G的堆,将这个堆分成多个区域,一个区域完成标记之后直接进行回收) - 使用verbose命令监视垃圾回收的过程:
-verbose:gc - 手动请求GC
System.gc()(在代码中请求)
VM命令总结
-Xms512m
-Xmx512m
-XX:MetaspaceSize=128m
-XX:MaxMetaspaceSize=128m
-XX:NewSize=128m
-XX:MaxNewSize=128m
-XX:SurvivorRatio=8
-XX:+DisableExplicitGC (禁止代码中显式调用GC)
-XX:+PrintGCDetails
-XX:+UseConcMarkSweepGC
-XX:ParallelCMSThreads=12
-verbose:gc
-XX:+HeapDumpOnOutOfMemoryError (保存内存快照)
-XX:+PrintGCTimeStamps (打印GC运行时间)
-Xloggc:…/…/logs/gc-console.log(将GC输出到文件)