HIT软件构造 JVM垃圾回收

JVM内存的结构

下面这张图是对jvm内存的额一个比较详细的解释

  1. 所有的内存分成三部分:新生代,旧生代,永久区(meta space)
  2. 新生代又分为eden,from,to三个部分
  3. 所有的allocated对象最开始是直接分配在eden中
  4. YGC之后(eden空间不足),所有的object转移到from区
  5. from和to之间进行n次交换(复制方法)
  6. to中存留下来的进入老年代
  7. 在静态域中存储的是静态变量和类信息
    HIT软件构造 JVM垃圾回收

垃圾回收策略

算法基本思想

基本思想:针对不同的区域,使用不同的GC策略
针对年轻代:只有一小部分对象可较长时间 存活,故采用copy算法减少GC代价
针对年老代:这里的对象有很高的幸存度,使 用Mark-Sweep或Mark-Compact算法

多种GC的说法

  1. minor GC:针对young generation(eden),使用minor GC进行垃圾收集
    Minor GC所需时间较短 – Objects that remain live for some number of minor
  2. full GC:如果old generation满了,则启动full GC
    Old generation满,意味着无法进行下一次minor GC
    注:
  3. 当perm generation满了之后,无 法存储更多的元数据,也启动full GC
  4. minorGC仅仅由eden区触发,但是进行整理的不仅仅是eden区,还有from和to,甚至还有old generation

JVM的优化

  1. 优化虚拟机堆的大小
    较大的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(堆的最大空闲比例)
  2. 选择一个垃圾回收方案
    -XX:+UseSerialGC (使用一个线程进行垃圾回收工作,它在工作时,冻结所有应用程序,也叫串行收集器)
    -XX:+UseParallelGC -XX:ParallelGCThreads=n (并行地执行minorGC,这样可以大大地减少开销;但是fullGC是在单一的线程中执行的。执行的时候会中止应用程序)
    -XX:+UseParallelOldGC(使用多线程进行年轻代和老年代的垃圾回收)
    -XX:+UseConcMarkSweepGC -XX:ParallelCMSThreads=n(并发地进行垃圾回收,并且只暂停很少的时间)
    –XX:+UseG1GC(对于一个空间大于4G的堆,将这个堆分成多个区域,一个区域完成标记之后直接进行回收)
  3. 使用verbose命令监视垃圾回收的过程:
    -verbose:gc
    HIT软件构造 JVM垃圾回收
  4. 手动请求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输出到文件)