推荐参数
响应时间优先型服务:
- 适合HTTP服务、DUBBO服务.
- 硬件:Linux x86_64服务器,8G内存
-Xms4g -Xmx4g -Xss256k -XX:+UseG1GC -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M -XX:MaxGCPauseMillis=30
-XX:MaxDirectMemorySize=1536m -XX:+UseStringDeduplication -XX:-OmitStackTraceInFastThrow -XX:ErrorFile=/data/logs/hs_err_%p.log
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/logs/heap_dump.hprof -Xloggc:/data/logs/gc_%p.log -XX:+PrintGCDetails
-XX:+PrintGCDateStamps -XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCApplicationStoppedTime
吞吐量优先的应用:
- 一般吞吐量优先的应用都有一个很大的年轻代和一个较小的年老代,这样可以尽可能回收掉大部分短期对象,减少中期的对象,而年老代尽存放长期存活对象.
- 适合专门跑定时任务、消息队列Consumer、离线日志分析、大数据处理的系统.
- 硬件:Linux x86_64服务器,8G内存.
-Xms5g -Xmx5g -Xmn1280m -Xss256k -XX:+UseParallelGC -XX:MetaspaceSize=128M -XX:MaxMetaspaceSize=512M -XX:MaxDirectMemorySize=512m
-XX:+UseStringDeduplication -XX:-OmitStackTraceInFastThrow -XX:ErrorFile=/data/logs/hs_err_%p.log -XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/data/logs/heap_dump.hprof -Xloggc:/data/logs/gc_%p.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps
-XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCApplicationStoppedTime
常用词
GC = JVM自动垃圾回收
参数解析
设置
- -Xmn 可以用于设置新生代大小,一般设置为整个堆空间的1/3到1/4.实际工作中应该根据系统的特点做合理的设置.基本策略是:尽可能将对象预留在新生代,减少老年代GC的次数.
- -Xms 在实际工作中,可以将初始堆-Xms与最大堆-Xmx设置为相等.这样做可以减少程序运行时进行垃圾回收的次数,从而提高程序性能.
- -Xss 栈内存大小,设置单个线程栈大小,一般默认512~1024kb.
- -XX:MetaspaceSize -XX:MaxMetaspaceSize 方法区(元空间),如果不指定元空间的大小,默认元空间最大的大小是系统内存,元空间一直扩大,虚拟机可能会消耗完所有的可用系统内存,如果元空间内存不够,就会报OOM.一般建议在JVM参数中将MetaspaceSize和MaxMetaspaceSize设置成一样的值,并设置得比初始值要大,对于8G物理内存的机器来说,一般我会将这两个值都设置为256M.
- -XX:MaxDirectMemorySize 最大可直接使用内存,如果不设置默认为-Xmx的值. (Xmx + MaxDirectMemorySize)的值不能超过docker的最大内存(默认服务器全部内存),不然docker内存占满了会被oomkill掉.
- -XX:+UseStringDeduplication 清除内存中重复的字符串.当在JVM启动时传递了这个参数的时候,JVM在做GC的同时会做重复字符串消除.GC的时候,JVM会检查内存中的所有对象,然后识别出重复的字符串对象并消除.
- -XX:MaxGCPauseMillis 表示每次GC最大的停顿毫秒数,VM将调整Java堆大小和其他与GC相关的参数,以使GC引起的暂停时间短于nnn毫秒,尽可能地保证内存回收花费时间不超过设定值.请注意,这可能会导致VM降低整体吞吐量(吞吐量=运行用户代码时间/VM总运行时间),并且在某些情况下,VM将无法达到所需的暂停时间目标.默认情况下,VM没有暂停时间目标值.GC的暂停时间主要取决于堆中实时数据的数量与实时数据量.该参数应谨慎使用,太小的值将导致系统花费过多的时间进行垃圾回收.原因是为满足最大暂停时间,VM将设置更小的堆,以存储相对少量的对象,来提升回收速率,会导致更高频率的GC.
日志
- -XX:+PrintGCDetails 打印GC详细日志信息.
- -XX:+PrintGCDateStamps GC的打印基于日期的时间戳
- -XX:-OmitStackTraceInFastThrow 省略异常栈信息从而快速抛出.
- -XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=targetDir/heap_dump.hprof 当堆内存空间溢出时输出堆的内存快照到指定目录. - -XX:+PrintGCApplicationConcurrentTime 打印每次GC时程序运行的时间,当GC后时间置为0.
- -XX:+PrintGCApplicationStoppedTime 每次GC使程序停顿的时间
- -XX:ErrorFile=targetDir/hs_err_pid_%p.log 指定错误文件的存放地址