JVM调优主要就是对垃圾回收器的调优
四种垃圾回收器
- 串行 -XX:+UseSerialGC
- 并行 -XX:+UseParallelGC -XX:+UseParalledlOldGC
- 并发(CMS) -XX:+UseParNewGC -XX:+UseConcMarkSweepGC
- -XX:+CMSParallelRemarkEnabled 降低标记停顿
- -XX:+UseCMSInitiatingOccupancyOnly 使用手动定义初始化定义开始CMS收集 禁止hostspot自行触发CMS GC
- -XX:CMSInitiatingOccupancyFraction=70 70%的时候进行回收
- G1(Garbage first) -XX:+UseG1GC JDK1.7出现,将堆等大小分区,每一个区是一堆连续的虚拟内存地址,标记结束后决定回收最空置的堆区
最重要的参数
- -Xms4096M -Xmx4096M: 初始堆大小,最大堆大小,最好设置一样
- -XX:PermSize=128M -XX:MaxPermSize=128M 持久代大小,128M足够用了,设置一样
- -Xmn2048m 年轻代大小,官方推荐设为JVM内存的3/8, 年轻代和年老代一般为1:2
- -XX:+UseStringDeduplication : jdk1.8中可以对重复字符串优化
- -XX:LargePageSizeInBytes=128m 设大一些可以更好的利用虚拟内存
- -XX:MaxMetaspaceSize=256m java1.8开始Metaspace是没有指定默认值,是动态增加的,为了保证稳定最好设定一个最大值
- -XX:ParallelGCThreads=8 并行或并发回收的线程数,推荐CPU的内核数
- -Xss256k 设置每个线程堆栈的大小
GC日志
打印日志会影响性能,建议不要在生产环境中使用
-XX:+UseGCLogFileRotation
-XX:NumberOfGCLogFiles=< number of log files >
-XX:GCLogFileSize=< file size >[ unit ]
-Xloggc:/path/to/gc.log
内存溢出日志
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=./java_pid.hprof
-XX:OnOutOfMemoryError=”< cmd args >;< cmd args >”
-XX:+UseGCOverheadLimit
字符串优化
-XX:+UseStringDeduplication java1.8才有的
-XX:+UseStringCache
-XX:+UseCompressedStrings
-XX:+OptimizeStringConcat
一些默认启动的参数
- -server Server Hotspot VM, 在64位的jdk中默认启用
- -XX:+DisableExplicitGC 禁用System.gc(),有说法在netty的nio去掉该配置项
- -XX:+AggressiveOpts 加快编译,使用JVM开发团队的最优成果