查看当前系统的垃圾回收算法:java -XX:+PrintCommandLineFlags -version
查看gc回收情况:
jstat -gc 28421 100s
jstat -gcutil 28421 100s
查看堆内存概况:
/usr/local/jdk1.8.0_131/bin/jmap -head 28421
关于CMS和fullgc:
cms只针对老年代进行垃圾回收,但是在回收的时候(包括ygc发现空间不够)如果判断需要进行压缩回收,就会触发fullgc,对全局的堆内存进行回收,采用的是单线程的老年代回收算法(跟cms算法写在一起),默认情况会进行压缩算法回收,可以配置回收前进行一次ygc,加快老年代的回收效果。
jvm参数建议:
-Xmx -Xms 最大最小堆生产建议设置一样,避免动态的扩缩容引起频繁的gc,如果测试环境可以设置较小的最小值,以充分利用资源做业务验证
-Xmn 新生代大小,对G1无效
-XX:PermSize,-XX:MaxPermSize 对JDK7及以下设置永久代,建议设置最大值,默认的最大值偏小,对大型应用可能会OOM
-XX:MetaspaceSize,-XX:MetaspaceSize 对JDK8及以上设置元空间,最大值为系统支持的最大内存,会动态扩容,注意内存泄漏后物理内存被用尽
-XX:+UseConcMarkSweepGC 使用CMS收集器
-XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 在CMS在对内存占用率达到70%的时候开始GC
-XX:ErrorFile=/jvm/hs_err_pid%p.log -Xloggc:/jvm/gc.log -XX:HeapDumpPath=/jvm -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+HeapDumpOnOutOfMemoryError 设置gc日志和OOM时dump内存快照
4G内存及以下建议采用cms:
-Xmx2688M -Xms2688M -Xmn960M -XX:MetaspaceSize=512M -XX:MetaspaceSize=512M -XX:+UseConcMarkSweepGC -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 -XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses -XX:+CMSClassUnloadingEnabled -XX:+ParallelRefProcEnabled -XX:+CMSScavengeBeforeRemark -XX:ErrorFile=/jvm/hs_err_pid%p.log -Xloggc:/jvm/gc.log -XX:HeapDumpPath=/jvm -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+HeapDumpOnOutOfMemoryError
6G及以上可以尝试G1:
-Xmx5440M -Xms5440M -XX:MaxMetaspaceSize=512M -XX:MetaspaceSize=512M -XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:+ParallelRefProcEnabled -XX:ErrorFile=/jvm/hs_err_pid%p.log -Xloggc:/jvm/gc.log -XX:HeapDumpPath=/jvm -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+HeapDumpOnOutOfMemoryError