排查一次线上的死锁问题

主要为了记录一些参数,然后结合遇到的一次生产环境问题排查问题的说明:

启动配置为: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方法,

加了一把锁,多线程不停的调用这个非公平锁的方法,整个方法执行结束后下一个线程才会调用,可能造成了死锁,大概定位到了问题,把多线程的调用方式修改后,内存溢出的问题解决。

同样值得学习和参考的一篇文章:

  https://blog.csdn.net/and1kaney/article/details/51214219?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.add_param_isCf&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.add_param_isCf

 

配置写法说明:

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

以下是操作步骤。

 

调优总结

https://www.jianshu.com/p/0bfd0f8c5fc4

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值