主要为了记录一些参数,然后结合遇到的一次生产环境问题排查问题的说明:
启动配置为:java -jar -Xms1024m -Xmx4096m -XX:PermSize=256M -XX:MaxPermSize=500M XXXXX-0.0.1-SNAPSHOT-FIX.jar
java -jar -Xms4096m -Xmx4096m -XX:-UseGCOverheadLimit -XX:PermSize=500M -XX:MaxPermSize=1000M examination-0.0.1-SNAPSHOT-FIX.jar
试探性的改了下,最小值与最大值相同,避免JVM因堆内存最小值与最大值不一致的波动,显然这次修改并没有什么实际作用。
线上环境在项目启动运行一段时间后报内存溢出。
然后开始排查问题,报出这个异常显然是栈内存溢出了,出现此种情况无非两种原因:
一种是建了大对象,第二就是有死循环。
我首先通过以下几个步骤找出日志:
你可以试试这种方式看有没有死锁
1、先执行top命令,找出最高的进程号
top
2、执行top -Hp 进程号,找出这个进程里占CPU和内存最高的子进程号
3、jstack 60889(占内存最高的子进程号) >> jstack.log
打开jstack.log日志
说明有一个队列在一直的挂起
定位到了有个文件可能存在死循环,不停的在调用。
然后搜索到WXPayReport这个类,发现有一段是一个多线程在跑,然后调用了队列的一个take方法,
加了一把锁,多线程不停的调用这个非公平锁的方法,整个方法执行结束后下一个线程才会调用,可能造成了死锁,大概定位到了问题,把多线程的调用方式修改后,内存溢出的问题解决。
同样值得学习和参考的一篇文章:
配置写法说明:
DIR_NAME=timing
-Xms512m -Xmx512m -XX:-UseGCOverheadLimit -XX:PermSize=256M -XX:MaxPermSize=256M -XX:+UseParallelGC -XX:+PrintGCDetails -Xloggc:/opt/server/$DIR_NAME/gc.log
生产内存溢出,通过jprofiler对dump文件进行分析
https://blog.csdn.net/snail_Bao/article/details/103809654
以下是操作步骤。
调优总结