stacktraces_Stacktraces告诉了事实。 但事实并非如此。
stacktraces
我们公司致力于使软件错误的原因对开发人员和运营透明。 与替代解决方案相反, 我们在您发现源代码中恶意代码的地方指出了问题的所在 。 即使目前我们以检测内存泄漏的能力而闻名,但我们也正在扩展到其他领域。 为了给您一些有关我们研究方向的提示,我们决定通过三个示例进行分享。
这些示例归结为JVM功能,以提供有意义的堆栈跟踪。 在许多情况下,stacktrace确实包含解决问题所需的所有信息。 在其他情况下,它只是浮出水面,不知道可能是什么引起了潜在的问题。 让我用触发以下臭名昭著的错误消息的三个示例进行说明:
- java.lang.OutOfMemoryError:无法创建新的本机线程
- java.io.IOException:系统中打开的文件过多
- java.lang.OutOfMemoryError:Java堆空间
所有示例都使用简单的代码片段进行了说明,从而使潜在问题更易于理解。
线程太多
static void createTooManyThreads() {try {for (int i = 0; i < TOO_MANY; i++) {Thread t = new Thread(new Runnable() {public void run() {try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}}});t.start();}} catch (OutOfMemoryError e) {e.printStackTrace();}
}
在上面的代码中,我们一直在启动线程,直到达到系统限制并遇到“ java.lang.OutOfMemoryError:无法创建新的本机线程”消息。 理解问题与线程限制耗尽有关,这有什么问题? 让我们仔细看看stacktrace:
java.lang.OutOfMemoryError: unable to create new native threadat java.lang.Thread.start0(Native Method)at java.lang.Thread.start(Thread.java:693)at eu.plumbr.demo.MisleadingStacktrace.createTooManyThreads(MisleadingStacktrace.java:34)at eu.plumbr.demo.MisleadingStacktrace.main(MisleadingStacktrace.java:16)
问题就一直盯着我们的脸-有人告诉我们添加最后一根稻草将骆驼背折断了。 同时,我们没有一个线索是,骆驼已经被完全装载了。 如果错误消息还包含一种方法,以查看在我们最后一次尝试启动最后一个调用导致上述堆栈跟踪之前,哪个调用堆栈正在消耗线程的不同跟踪,那么这将使开发人员的工作更加轻松。
但是让我们看一下相同的问题–从另一个角度来看资源消耗:
打开的文件太多
再次,让我们从示例代码开始:
static void createTooManyFiles() {try {for (int i = 0; i < TOO_MANY; i++) {File f = new File(PATH_TO_FILE + i + ".txt");f.createNewFile();OutputStream s = new FileOutputStream(f);s.write(1);}} catch (IOException e) {e.printStackTrace();}
}
该示例尝试创建许多文件,并且仅在每个文件中写入一个整数而不关闭前一个文件。 再次,运行上面的代码会导致堆栈跟踪不太有用:
java.io.IOException: Too many open files in systemat java.io.UnixFileSystem.createFileExclusively(Native Method)at java.io.File.createNewFile(File.java:947)at eu.plumbr.demo.MisleadingStacktrace.createTooManyFiles(MisleadingStacktrace.java:45)at eu.plumbr.demo.MisleadingStacktrace.main(MisleadingStacktrace.java:17)
现在,以不同的方式掩盖了相同的问题-我们确实得到了这样的消息:我现在尝试过多地打开一个文件,但是-谁打开了其他文件以在无法完成运行的程度上向JVM施加压力?
如果您仍然不确定,请看第三个示例,即我们目前的面包和黄油:
消耗太多内存
代码示例再次很简单–我们采用数据结构并不断增加结构,直到可用堆耗尽为止:
static void createTooLargeDataStructure() {try {List l = new ArrayList();for (int i = 0; i < TOO_MANY; i++) {l.add(i);}} catch (OutOfMemoryError e) {e.printStackTrace();}
}
运行代码会给您带来臭名昭著的java.lang.OutOfMemoryError:Java堆空间消息。 同样,如果所讨论的数据结构是通过源代码中的不同可能位置填充的,则很难解释。
我知道所有C语言开发人员现在都无奈地耸了耸肩,因为在他们的世界中,以上所有内容都只是采取段错误的形式,但是–如果我们走得那么远,为什么我们不能做得更好? 我相信我们可以做到,这就是我们要做的– 找到适合您的性能瓶颈 。
如果您对完整的代码示例感兴趣,可以在此处下载。 该代码在JDK 7u25上的OS X 10.9的Macbook Pro上运行。 之后,请确保您不会错过未来有趣内容的更新,并订阅我们的Twitter feed 。
翻译自: https://www.javacodegeeks.com/2013/11/stacktraces-are-telling-the-truth-but-not-the-whole-truth.html
stacktraces
stacktraces_Stacktraces告诉了事实。 但事实并非如此。相关推荐
- NLP数据科学家不会告诉你的残酷事实
2020-02-22 12:30:00 全文共2044字,预计学习时长6分钟 来源:Pexels 近期,Tractica的报告显示,人工智能支持的NLP软件市场预计将从2016年的1.36亿美元增加到 ...
- 【内存泄漏】一个现网问题告诉你血淋淋的事实:java内存泄漏很严重
目录 什么是内存泄漏 GC原理 GC Roots对象 java内存模型 现网问题 如何发现和解决 总结,什么情况下会出现内存泄漏 很多同学可能都有一个误解,C++才需要程序员自己管理对象的生命周期,在 ...
- 什么是事实,事实和理性思维
事实与想法是存在差异的.且说日常生活和别人的交互中,别人的各种举动和话语都有可能被我们诠释成各样的意义,从而产生情绪等,这一过程是在一瞬间完成的,没有经过一定训练的人是感受不到这一过程的. 所以别人的 ...
- 双核CPU揭密:英特尔/AMD没有告诉你的五项事实【ZZ】
双核CPU揭密:英特尔/AMD没有告诉你的五项事实 上网时间 : 2006年02月23日 打 印 版 推 荐 给 同 仁 发 送 查 询 如今,关于双核处理器的大肆宣传甚嚣尘上,以致于人们 ...
- 关于 HTML5 的 11 个让人难以接受的事实
HTML5为Web开发者提供了很多强大的新特性,但是它的一些特定的限制会让它无法和本地应用匹敌. HTML5整合进了很多新的特性,并且有可能提升Web编程模式.和每一个阅读技术资讯的人所知道的一样,没 ...
- 关于HTML5的11个让人难以接受的事实
HTML5为Web开发者提供了很多强大的新特性,但是它的一些特定的限制会让它无法和本地应用匹敌. HTML5整合进了很多新的特性,并且有可能提升Web编程模式.和每一个阅读技术资讯的人所知道的一样,没 ...
- Ansible03-管理变量、加密、事实
目录 一.管理变量 1.1.变量的基本用法 1.2.使用已注册变量捕获命令输出 二.管理加密 2.1.ansible-vault常用场景 三.管理事实 3.1.事实基本用法 3.2.创建自定义事实 3 ...
- 因此,您是一名新软件工程师。 让我们面对一些事实,揭穿一些神话。
by Trey Huffine 通过Trey Huffine 因此,您是一名新软件工程师. 让我们面对一些事实,揭穿一些神话. (So you're a new Software Engineer. ...
- Greenplum 实时数据仓库实践(8)——事实表技术
目录 8.1 事实表概述 8.2 周期快照 8.3 累积快照 8.4 无事实的事实表 8.5 迟到的事实 8.6 累积度量 小结 上一篇里介绍了几种基本的维度表技术,并用示例演示了每种技术的实现过程. ...
最新文章
- 《剑指offer》第五十题(字符串中第一个只出现一次的字符)
- 我们不应歧视任何编程语言,她们都是萌娘!(有图有真相)
- 阿里中间件性能挑战赛启动,“开源”赛题独家剖析!
- SAP Spartacus 页面标题的更改机制 - 谁动了我的页面标题?
- mac mysql 设置短命令_短小强大的8个命令,分分钟帮你提高工作效率!
- 鸿蒙系统的升级名单,定档6月2日!鸿蒙“首批”升级名单公布,共计11款华为机型!...
- 队列处理高并发_高并发架构消息队列面试题解析
- Webservice接口
- python条件语句代码例子_Python 炫技操作:条件语句的七种写法
- 多电压等级计算机潮流计算,电力系统潮流计算
- 自制solidworks图框步骤_如何建立标准的solidworks图框模板
- tp房产源码tpfangchan-fangcms-tphouse火车头采集软件方法
- java 检测表情符号_检测字符串中的字符是否为表情符号(使用Android)
- 程序员升职记-五种种说话套路
- 八大排序算法(C语言)
- 真的来了:ArcGIS Pro2.5可以安装使用了-安装教程(附安装包下载)
- 手持两把锟斤拷,口中疾呼烫烫烫。脚踏千朵屯屯屯,笑看万物锘锘锘
- java文件恢复软件,文件恢复软件 免费-文件恢复软件 免费版
- 商务汇报PPT制作的七堂课-第三课:结构搭建
- 【上电即上华为云】华为云AIoT智联开发板_mcu_HK32F103Vx
热门文章
- 2017西安交大ACM小学期 有趣异或[Trie树]
- Sentinel(十二)之实时监控
- 深入浅出 Java CMS 学习笔记
- Spring Bean 定义
- JVM 调优和垃圾回收器说明
- jdk1.8.0_45源码解读——ArrayList的实现
- Java中的ThreadPoolExecutor类
- Oracle入门(十四.2)之PL / SQL的好处
- 内存不足The following exception is caused by a lack of memory or swap, or not having swap
- Servelt 中文乱码