e.printStackTrace()导致的锁死,别用

https://my.oschina.net/sxgkwei/blog/825700

e.printStackTrace() 会导致锁死?这仅仅是打印啊,怎么可能?!

先别惊呼不可能,且听我细细道来。

先看截图1:

注意右下角区域,红框部分。这块内存是什么呢?非堆!那么,左边是代码缓存区内存,右边红框就是字符串池,常量,基本类型数据的内存区。然后呢?已经满了。什么原因呢?e.printStackTrace()!

满了的后果呢?整个web服务,访问之后,没响应了,就当是卡死掉了。

 

 

那么,让我们再来理理整个事件产生的经过:

短时间内大量请求访问此接口 -> 代码本身有问题,很多情况下抛异常  -> e.printStackTrace() 来打印异常到控制台 -> 产生错误堆栈字符串到字符串池内存空间(我表示怀疑) -> 此内存空间一下子被占满了 -> 开始在此内存空间产出字符串的线程还没完全生产完整,就没空间了 ->  大量线程产出字符串产出到一半,等在这儿(等有内存了继续搞啊)-> 相互等待,等内存,锁死了,整个应用挂掉了。

个人判断:是因为 printstackTrace()是打印的栈信息,栈不属于堆内存里的,多了自然影响,本身栈内存就不大,从其他层面使得卡慢

posted @ 2022-01-13 16:01  君子笑而不语  阅读(127)  评论(0编辑  收藏  举报