作者:sxgkwei
https://my.oschina.net/sxgkwe…
e.printStackTrace() 会导致锁死?
这仅仅是打印啊,怎么可能?!
先别惊呼不可能,且听我细细道来。
先看截图 1:
留神右下角区域,红框局部。这块内存是什么呢?
非堆!那么,右边是代码缓存区内存,左边红框就是字符串池,常量,根本类型数据的内存区。
而后呢?曾经满了。什么起因呢?e.printStackTrace()!
满了的结果呢?整个 web 服务,拜访之后,没响应了,就当是卡死掉了。
再来看截图 2:
看看有多少 web 的申请线程,被卡住在打印这一步!
起因呢?
要打印字符串输入到管制台上,那你字符串常量池所在的内存块要有空间啊。
然而,因为 e.printStackTrace() 语句要产生的字符串记录的是堆栈信息,太长太多,内存被填满了!留神 下面代码语句:4208 行!
来看图 3:
没故障,没没事儿找事儿委屈谁。就是这句代码惹的祸!当然,我抵赖,被 try 住的代码自身就有问题,导致很多调用都会抛异样。
那么,让咱们再来理理整个事件产生的通过:
短时间内大量申请拜访此接口
-\> 代码自身有问题,很多状况下抛异样
-\> e.printStackTrace() 来打印异样到控制台
-\> 产生谬误堆栈字符串到字符串池内存空间
-\> 此内存空间一下子被占满了
-\> 开始在此内存空间产出字符串的线程还没齐全生产残缺,就没空间了
-\> 大量线程产出字符串产出到一半,等在这儿(等有内存了持续搞啊)
-\> 互相期待,等内存,锁死了,整个利用挂掉了。
综上,这就是 e.printStackTrace() 引发的血案。
总结当然重要,有 3 点:
1,代码品质啊亲,代码不抛异样咱不就能欢快的持续浪么?
2,不要应用 e.printStackTrace() 啊,这玩意儿,在我的项目公布后,除过一直的刷控制台,并没用什么卵用啊,您到是用 log 对象输入到日志文件外面啊。
3,推及开来,在 java 中,会产生大量字符串的办法,应用时,肯定得悠着点,别一不小心撑到肚子(字符串池所属的那么点非堆内存空间),撑到肚子了,会死的啊。
近期热文举荐:
1.Java 15 正式公布,14 个新个性,刷新你的认知!!
2. 终于靠开源我的项目弄到 IntelliJ IDEA 激活码了,真香!
3. 我用 Java 8 写了一段逻辑,共事直呼看不懂,你试试看。。
4. 吊打 Tomcat,Undertow 性能很炸!!
5.《Java 开发手册(嵩山版)》最新公布,速速下载!
感觉不错,别忘了顺手点赞 + 转发哦!