Java程序挂掉的几种可能
来源:互联网 发布:淘宝店名名字 编辑:程序博客网 时间:2024/05/01 13:36
今天花了一整天在跟踪一个问题,每次感觉已经快找到原因的时候发现现象又变了,我觉得从中吸取的教训可以给大家分享一下。
为了重现这个现象,我写了一个简单的例子。在本例中,先初始化了一个map,然后用一个无限循环将一些键值对插入到map里面:
class Wrapper { public static void main(String args[]) throws Exception { Map map = System.getProperties(); Random r = new Random(); while (true) { map.put(r.nextInt(), "value"); } }}
你可能也猜到了,这段代码编译执行后无法正常结束。当我用这组参数启动的话:
java -Xmx100m -XX:+UseParallelGC Wrapper
我会在终端中看到java.lang.OutOfMemoryError: GC overhead limit exceeded的异常信息。不过如果我调整一下堆大小或者是GC的类型的话,在我的Mac OS X 10.9.2 系统上用Oracle Hotspot JDK 1.7.0_45来运行,就会出现不同的情况。
比如说,我用一个较小的堆来运行这个程序,就像下面这样:
java -Xmx10m -XX:+UseParallelGC Wrapper
应用程序会抛出一段大家更熟悉的错误信息然后挂掉:java.lang.OutOfMemoryError: Java heap space。
如果你换成ParallelGC以外的GC策略的话,比如说-XX:+UseConcMarkSweepGC or -XX:+UseG1GC,你将会看到由默认的异常处理器所抛出的异常,并且你看不到堆栈信息了,因为堆已经没有空间了,甚至连异常的堆栈信息都没法填充了,因此它在创建异常的时候就挂掉了:
My Precious:examples vladimir$ java -Xmx100m -XX:+UseConcMarkSweepGC Wrapper Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "main"
这说明了什么?当资源紧缺的时候,你根本没法判断你的应用程序是怎么挂掉的,因此不要指望能出现你所预期的一系列错误提示。从上面这个例子中可以看到,你的程序可能会以三种完全不同的方式挂掉:
GC的安全性检查失败:一旦GC花费的时间占到98%以上的话,JVM就会宣告投降了: java.lang.OutOfMemoryError: GC overhead limit exceeded。
无法为下一个操作分配足够的内存:如果无法满足下一条指令所需要分配的内存的话,你会收到一条”java.lang.OutOfMemoryError: Java heap space” 的错误信息。
你可能也总结出来了,还有一种情况是你的内存已经紧张到连JVM创建一条OutOfMemoryError异常,填充堆栈信息,打印到屏幕上这点要求都满足不了了。这种情况UncaughtExceptionHandler会捕获到这个错误,而不再走通常的错误流程。这个处理器恰如其名,当线程由于某个异常快要挂掉的时候,它开始出来收场了。出现这种情况的话,JVM会找到线程对应的 UncaughtExceptionHandler,然后调用它的uncaughtException方法。
因此当你捕获到内存不足的异常并自以为已经胸有成竹时,请再多思考一下 。系统已经处于崩溃的边缘,你原认为你能依赖的信息很可能会消失或者改变。留给你的只有一脸茫然,正如我前面那12个小时中那样。
如果你已经耐心读到这了,我推荐你关注下我们的twitter帐号。我们每周都会发一些工作中碰到的一些性能调优的问题。
原创文章转载请注明出处:Java程序挂掉的几种可能
英文原文链接
- Java程序挂掉的几种可能
- Java程序挂掉的几种可能
- 造成IOS程序崩溃的几种可能的原因
- “未能从程序集中加载”的几种可能
- spring出现java.lang.IllegalStateException异常的几种可能
- explorer出错的几种可能原因
- 工程乱码的几种可能
- ping不通的几种可能原因
- 可能致癌的几种化妆品
- undeclared identifier的几种可能
- Android403Forbidden的几种可能错误
- Android内存泄漏的几种可能
- 内存溢出的几种可能
- 训练不收敛的几种可能
- Java程序调试的几种方法
- 运行 Think In Java中的 RMI 示例可能产生的几种异常及解决
- 可能导致Java内存泄漏的几项原因
- 可能导致Java内存泄漏的几项原因
- 关于img的href和src取变量的方法
- python新手常犯错误
- html中div不自动换行、强制不换行的具体实现
- iOS6新特征:UICollectionView介绍
- UVa 10392 - Factoring Large Numbers
- Java程序挂掉的几种可能
- QT静态库和动态库的导出
- Struts2教程7:上传任意多个文件
- 黑马程序员—静态概述
- hdu 2686 Matrix (多线程dp)
- 一道SQL的面试题之联想
- leetcode day5 -- Reorder List && Linked List Cycle II
- Codeforces Round #243 (Div. 2) Problem B - Sereja and Mirroring 题解
- Shapefile文件组成,Shapefile文件的修复