Parallel Scavenge 收集器 = “吞吐量优先” 收集器
此收集器是尽可能缩短垃圾回收的时间,eg: 从10秒收集10MB 到 5秒收集6MB,收集更加频繁
-XX:MaxGCPauseMillis // 最大垃圾回收停顿时间, >0,=垃圾回收速度,但速度快了 收集量也少了。-XX:GCTimeRatio //吞吐量时间限制 or 收集量时间限制(运行代码时间 / (运行代码时间 + GC时间))100> x >0, 垃圾回收时间占总时间的比率 = 吞吐量的倒数,默认为99,eg : -XX:GCTimeRatio=19 则:若MaxGCPauseMillis =1, 1/(1+19)= 5%,//最大的GC时间最大只能占总时间的5%,限制死!默认为1%。{ -Xmn //手动指定新生代大小 -XX: SurviorRatio // 手动指定Eden 与 Survior比例 -XX:PretenureSizeThreshold //手动执行晋升老年代的年龄}-XX:+UseAdaptiveSizePolicy //自动动态分配上面三项基本项-Xmx //设置最大堆大小
CMS收集器
Concurrent Mark Sweep = 并发标记擦除,尽可能缩短回收时间,比上面的力度大很多。
缺点:与应用程序抢占CPU资源很厉害,收集结束有大量碎片。
-XX:CMSInitiatingOccupancyFraction //回收触发百分比,越高越好 用于提高回收量 降低回收次数 太高也不好 最好80%。-XX:+UseCMSCompactAtFullCollection // CMS顶不住要Full GC时候 自动碎片合并,默认开启的。-XX:+PrintGCDetails // 打印GC日志
G1收集器
垃圾回收不再分代,而是把整个JVM划分均等Region,然后去各个Region回收。
-XX:+UseG1GC //启用 G1 回收器-XX:G1NewSizePercent // Young Generation 占 整个堆的大小 默认5%-XX:G1MaxNewSizePercent // Yong Generation 最大占 整个堆的大小 默认 60%-XX:+G1SummarizeRSetStats // 打印G1时JVM 调试信息-XX:+G1TraceConcRefinement //打印G1时JVM日志
Eden Space
Jvm区域总体分两类,heap区和非heap区。
heap区又分:Eden Space(伊甸园)、Survivor Space(S0,S1)(幸存者区)、Tenured Gen(老年代-养老区)。
非heap区又分:Code Cache(代码缓存区)、Perm Gen(永久代)、Jvm Stack(java虚拟机栈)、Local Method Stack(本地方法栈)
-XX: NewSize // Yong Generation 大小,建议整个堆1/3-XX:MaxNewSize // Yong Generation 最大大小-XX: SurvivorRatio // 设置 Eden 与 Survivor 比例,默认 8:1-XX:+PrintTenuringDistribution // 打印每次 Minor GC后 Survivor 中对象大小
STW(Stop The World)
Java运行过程中 突然全部进程停止 只有GC在运行的情况。
-Xss // 设置每个线程能用的Heap大小 eg -Xss128k-XX:+PrintGCDetails // 打印GC详细信息-XX:+PrintGCDateStamps // 打印的时候显示时间-XX:+PrintHeapAtGC // 在每次GC前 显示Heap中对象的状态-Xloggc:./gclogs // 将 GC 输出到日志文件中
GC日志
Tenured: 老年代, Perm: 永久代 = 方法区 比老年代还久 不容易被回收。Minor GC :发生在Young Generation的GC。Full GC: 发生在Old Generation的GC,比Minor GC用时慢10倍。//Yong generation 在不通收集器日志名不同:DefNew : Default new generation 在 Serial收集器中名字。ParNew: Parallel New Generation 在ParNew收集器中的名字。PSYoungGen: 在 Parallel Scavenge收集器中的名字。// 组合拳: -Xmn20M // Java Heap大小为20M-Xmx10M // 10M分给Yong Generation -Xmn10M // 10M分给Old Generation-XX:SurvivorRatio=8 // 设置Eden 与 Survivor 比例 8:1-verbose:gc // 输出JVM GC详情,放在参数第一个。// 进入老年代3条途径:-XX:MaxTenuringThreshold=15 // 在 survivor 中待到15岁 进入Old Generation-大对象直接进入Old Generation,eg: //很长的字符串 或 byte array -同年2个或多个对象和达到Survivor空间一半,即使没到15岁也自动进入Old Generation
JAVA中查看GC
byte[] array = new byte[300*1024*1024];for(MemoryPoolMXBean memoryPoolMXBean: ManagementFactory.getMemoryPoolMXBeans()){ System.out.println(memoryPoolMXBean.getName()); System.out.println(memoryPoolMXBean.getUsage().getUsed());}
// 获取所有JVM参数信息java -XX:+PrintVMOptions -XX:+AggressiveOpts -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+PrintFlagsFinal -version