线上jvm如何配置的?
1、这里采用4核8g的机器
-server -Xms4g -Xmx4g -Xss256k
-XX:PermSize=512m
-XX:MaxPermSize=512m
-XX:MaxTenuringThreshold=20
-XX:CMSInitiatingOccupancyFraction=80
-XX:+UseCMSInitiatingOccupancyOnly
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/path/heap/dump.hprof
-XX:+PrintGCTimeStamps
-XX:+PrintGCDeatils
-XX:+PrintGCDeatils -Xloggc:<filename>
解释:
-server:必须得加,因为你是服务端程序,用-server启动较慢,但是启动后性能会更好
-Xms4g:堆内存的初始大小是4g,一般我们线上常用的普通应用系统是4核8G的虚拟机,足够了,所以一般堆内存给4g,稍微留点富裕,毕竟操作系统自己也要用内存的
-Xmx4g:堆内存的最大大小是4g,一般就是跟初始大小是一样的,一般不建议设置比-Xms4g大,因为导致运行时动态增加堆内存,会有问题
-Xss256k:每个线程使用栈内存大小,这个一般设置成256k就差不多够了,毕竟主要内存都是放堆里的,栈里就是一些变量什么的
-XX:PermSize=512m,这是永久代大小,这是放加载的类之类的东西的,一般设置512m是足够了,太小了,有的时候在就是那种动态生成字节码的场景下,可能会有问题
-XX:MaxPermSize=512m,这就是永久代的最大大小,一般就跟上面那个一样就行了
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/heap/dump.hprof 出现oom的时候,把指定java进程的堆内存快照搞到一个指定的文件里去
-XX:+PrintGCTimeStamps-XX:+PrintGCDeatils-XX:+PrintGCDeatils -Xloggc:<filename> 让线上系统定期打出来gc的日志,如果发现线上系统经常卡顿,可以立即去查看gc日志
-XX:MaxTenuringThreshold=20:这个就是说新生代里多少次没回收掉就进入老年代
-XX:CMSInitiatingOccupancyFraction=80,设置老年代占用多大比例后触发cms垃圾回收
-XX:+UseCMSInitiatingOccupancyOnly,这个跟上面那个参数配合起来使用,就是说仅仅使用上面指定的那个比例,否则不指定这个参数,jvm第一次使用上面那个比例后,后续会自动调整那个比例
2、尽可能的去调优一下jvm参数后,去压测调节的参数进行内存使用数据分析
发现分析了一下生产环境的jvm的运行情况,非常好,并发量很低,几十分钟才一次young gc,存活的对象特别少,几乎都在s区域,老年代几乎没什么对象,几天或者几周才发生一次full gc。
在自己本地单机部署,测试环境里,去压测,每秒单机有500并发请求,去观察jvm的运行情况,这个时候他会不会存在频繁gc的问题,你就去调优一下,你就可以基于这个压测的例子去说了。