查看Java8默认GC策略
-
java -XX:+PrintCommandLineFlags -version
-
jinfo -flags PID 查看 “Non-default VM flags:” 中的信息
发现:
默认下是 -XX:+UseParallelGC : 新生代并发收集,老年代串行收集。
指令
典型配置
- -XX:+UseSerialGC:
新生代,老年代都使用串行回收收集器。新生代使用复制算法,老年代使用标记-整理算法。使用一个线程进行GC,串行,其它工作线程暂停。
Jvm运行在Client模式下的默认值,使用Serial + Serial Old的收集器组合进行内存回收 - -XX:+UseParNewGC:
新生代进行并行回收,老年代仍旧使用串行回收。默认关闭。Serial收集器的多线程版,用多个线程进行并行GC,其它工作线程暂停。(操作系统是多核CPU上效果明显,单核CPU建议使用串行回收器。)打印GC详情时ParNew标识着使用了ParNewGC回收器。[GC[ParNew: 78656K->8703K(78656K), 0.0180555 secs] 81048K->17429K(253440K), 0.0187828 secs] [Times: user=0.03 sys=0.00, real=0.02 secs]
- -XX:+UseParallelGC:
吞吐量优先的并发垃圾回收器,作用在新生代,使用复制算法。 关注CPU吞吐量,即运行用户代码的时间 /(运行用户代码时间+垃圾收集时间)。
Jvm运行在Server模式下的默认值,使用Parallel Scavenge + Serial Old的收集器组合进行回收 - -XX:+UseParallelOldGC:
使用Parallel Scavenge + Parallel Old的收集器组合进行回收 ,默认是使用单线程。打印出的GC会带PSYoungGen、ParOldGen关键字。[Full GC [PSYoungGen: 4032K->0K(145920K)] [ParOldGen: 164500K->138362K(246272K)] 168532K->138362K(392192K) [PSPermGen: 67896K->67879K(136192K)], 1.006
- -XX:ParallelGCThreads=<N>:
设置并发垃圾回收的线程数。可设置与机器处理器数量相等。 该参数jvm会默认设置成online的cpu的核数但并不包括被shutdown的cpu的核数 - -XX:MaxGCPauseMillis=<N>:
指定垃圾回收时的最长暂停时间,它的参数运行值是一个大于0的毫秒数。收集器将尽力保证垃圾回收时间不超过设定值,系统运行的需要回收的垃圾总量是固定的,缩短停顿时间的同时会增大回收频度。 - -XX:GCTimeRatio=<N>:
吞吐量为垃圾回收时间与非垃圾回收时间的比值,它运行的参数值是0-100的整数。公式为1/(1+N)。eg: -XX:GCTimeRatio=19时,表示5%(1/(1+19))的时间用于垃圾回收。默认情况为99,即1%的时间用于垃圾回收。 - -XX:UseAdaptiveSizePolicy:
自适应的调节策略。JVM会根据实际运行情况动态调整新生代大小、新生代和s区比例、晋升老年代对象大小等细节参数。
(JDK 1.8 默认使用 UseParallelGC 垃圾回收器,该垃圾回收器默认启用该配置。由 AdaptiveSizePolicy 引发的 GC 问题)
- -XX:ParallelGCThreads=<N>:
- -Xms:
表示java虚拟机堆区内存初始内存分配的大小。 - -Xmx:
表示java虚拟机堆区内存可被分配的最大上限 (开发过程中,通常会将-Xms 与-Xmx两个参数的配置相同的值,其目的是为了能够在java垃圾回收机制清理完堆区后不需要重新分隔计算堆区的大小而浪费资源) - -XX:newSize:
表示新生代初始内存的大小,应该小于-Xms的值; - -XX:MaxNewSize:
表示新生代可被分配的内存的最大上限;当然这个值应该小于-Xmx的值; - -Xmn:
这个参数则是对 -XX:newSize、-XX:MaxnewSize两个参数的同时配置,
也就是说: 如果通过-Xmn来配置新生代的内存大小,那么-XX:newSize = -XX:MaxnewSize = -Xmn,虽然会很方便,但需要注意的是这个参数是在JDK1.4版本以后才使用的。 - -Xss:
为jvm启动的每个线程分配的内存大小, - -XX:MetaspaceSize:
class metadata的初始空间配额,以bytes为单位,达到该值就会触发垃圾收集进行类型卸载,同时GC会对该值进行调整:如果释放了大量的空间,就适当的降低该值;如果释放了很少的空间,那么在不超过MaxMetaspaceSize(如果设置了的话),适当的提高该值。 - -XX:MaxMetaspaceSize:
可以为class metadata分配的最大空间。默认是没有限制的。 - -XX:MinMetaspaceFreeRatio:
在GC之后,最小的Metaspace剩余空间容量的百分比,减少为class metadata分配空间导致的垃圾收集 - -XX:MaxMetaspaceFreeRatio:
在GC之后,最大的Metaspace剩余空间容量的百分比,减少为class metadata释放空间导致的垃圾收集 - -XX:+PrintTenuringDistribution:
用于显示每次Minor GC时Survivor区中各个年龄段的对象的大小 - -XX:InitialTenuringThreshol和-XX:MaxTenuringThreshold:
用于设置晋升到老年代的对象年龄的最小值和最大值,每个对象在坚持过一次Minor GC之后,年龄就加1。 - -XX:PreternureSizeThreshold:
直接晋升老年代的对象大小,设置了这个参数后,大于这个参数的对象直接在老年代进行分配 - -XX:+HandlePromotionFailure :
是否允许新生代收集担保,进行一次minor gc后, 另一块Survivor空间不足时,将直接会在老年代中保留。 - -XX:+DisableExplicitGC :
关闭手动System.gc() -
-XX:+UseFastaccessorMethods :
原始类型优化
垃圾回收统计信息
- -XX:+PrintGC
[GC 118250K->113543K(130112K), 0.0094143 secs] [Full GC 121376K->10414K(130112K), 0.0650971 secs]
- -XX:+PrintGCDetails
[GC [DefNew: 8614K->781K(9088K), 0.0123035 secs] 118250K->113543K(130112K), 0.0124633 secs] [GC [DefNew: 8614K->8614K(9088K), 0.0000665 secs][Tenured: 112761K->10414K(121024K), 0.0433488 secs] 121376K->10414K(130112K), 0.0436268 secs]
- -XX:+PrintGCTimeStamps 与上两命令合用
11.851: [GC 98328K->93620K(130112K), 0.0082960 secs]
- -XX:+PrintGCApplicationConcurrentTime 打印每次垃圾回收前,程序未中断的执行时间。可与上面混合使用
Application time: 0.5291524 seconds
-
-XX:+PrintGCApplicationStoppedTime 打印垃圾回收期间程序暂停的时间。可与上面混合使用
Total time for which application threads were stopped: 0.0468229 seconds
-
-XX:PrintHeapAtGC 打印GC前后的详细堆栈信息
34.702: [GC {Heap before gc invocations=7: def new generation total 55296K, used 52568K [0x1ebd0000, 0x227d0000, 0x227d0000) eden space 49152K, 99% used [0x1ebd0000, 0x21bce430, 0x21bd0000) from space 6144K, 55% used [0x221d0000, 0x22527e10, 0x227d0000) to space 6144K, 0% used [0x21bd0000, 0x21bd0000, 0x221d0000) ...
-
-Xloggc:filename 指定log输出文件
eg