乐趣区

关于java:Oh-My-GodeprintStackTrace-导致系统卡崩

作者: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 开发手册(嵩山版)》最新公布,速速下载!

感觉不错,别忘了顺手点赞 + 转发哦!

退出移动版