文档章节

e.printStackTrace()导致的锁死

sxgkwei
 sxgkwei
发布于 2017/01/16 15:23
字数 609
阅读 7.2K
收藏 5

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中,会产生大量字符串的方法,使用时,一定得悠着点,别一不小心撑到肚子(字符串池所属的那么点非堆内存空间),撑到肚子了,会死的啊 。

© 著作权归作者所有

sxgkwei

sxgkwei

粉丝 70
博文 23
码字总数 18940
作品 0
长宁
项目经理
私信 提问
加载中

评论(2)

olduncleluo
olduncleluo
增长的空间是jvm的CodeCache区
HChan916
HChan916
您好这里的‘字符串池内存空间 ’是指的字符串常量池吗?
如果是字符串常量池的话,应该只有一份啊
个人愚见,请您指正🙏
jvm原理和优化

在上文中我们分析了很多性能监控工具,介绍这些工具的目的只有一个,那就是找出对应的性能瓶颈。盲目的性能调优是没有效果的,只有充分知道了哪里出了问题,针对性的结果才是立竿见影的。解决...

罗文浩
2016/09/09
125
0
程序员笔记|编写高性能的Java代码需要注意的4个问题

一、并发 Unable to create new native thread …… 问题1:Java中创建一个线程消耗多少内存? 每个线程有独自的栈内存,共享堆内存 问题2:一台机器可以创建多少线程? CPU,内存,操作系统...

宜信技术学院
2019/05/10
3.4K
16
死磕 java同步系列之CyclicBarrier源码解析——有图有真相

问题 (1)CyclicBarrier是什么? (2)CyclicBarrier具有什么特性? (3)CyclicBarrier与CountDownLatch的对比? 简介 CyclicBarrier,回环栅栏,它会阻塞一组线程直到这些线程同时达到某个...

彤哥读源码
2019/06/28
230
0
e.printStackTrace()不是打印吗,还能锁死?

  作者:sxgkwei   出处:https://dwz.cn/tQe4fLeD   会导致锁死?这仅仅是打印啊,怎么可能?   先别惊呼不可能,且听我细细道来。   先看截图1:      注意右下角区域,红框...

java进阶架构师
2019/10/23
0
0
java wait notify的用法

java wait notify的用法  wait(),notify(),notifyAll()不属于Thread类,而是属于Object基本类,也就是说每个对像都有wait(),notify(),notifyAll()的功能.由于都个对像都有锁,锁是每个对像的基...

木辰寿
2012/06/04
703
0

没有更多内容

加载失败,请刷新页面

加载更多

MySQL5.7特性:JSON数据类型

概述 MySQL5.7的发行声明中,官方称之为里程碑式的版本,除了运行速度大幅度提升之外,还添加了之前版本没有的功能,如本文所述的原生JSON数据类型功能。 在此版本之前,MySQL所有的JSON数据...

php开源社区
19分钟前
25
0
Debian10 Xfce 创建Postman桌面快捷方式

网上的教程按照操作,发现问题,立马再bing去搜索,立马有找到答案了 分别在用户的Desktop目录下以及.local/share/applications目录下新建Postman.desktop [Desktop Entry]Encoding=UTF-8...

W_Lu
22分钟前
26
0
设计模式-里氏替换

先来看个最正宗的定义 如果对每一个类型为S的对象o1,都有类型为T的对 象o2,使得以T定义的所有程序P在所有的对象o1都代换成o2时,程序P的行为没有发生变 化,那么类型S是类型T的子类型。 我...

yiduwangkai
24分钟前
36
0
设计模式1 懒汉模式和饿汉模式

1.什么是单例模式 单例模式和名字一样就是只有单个实例对象存在,有时候我们只需要一个对象如果每次都new一个一样的,这样会给JVM的内存造成负担从而也会是GC时间变长。比如我们使用Spring的...

hong查理
32分钟前
34
0
Vue中父子组件传值在电商项目中的使用情景之一

最近做的电商项目两个页面都用到了级联的一个查询;所以我们为了简化代码,就将级联的查询抽取成了一个公共组件(components目录下的HearderSearch.vue); 但是我们的级联查询需要支持Seo,这样我...

费先森
40分钟前
25
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部