扣丁学堂告诉你Java程序在什么情形下会挂掉

2018-03-13 16:31:34 550浏览

        小编想问一下大家知不知道Java程序在什么情形下会挂掉?有哪些小伙伴曾经碰到过Java程序挂掉的情况?本篇文章扣丁学堂Java培训机构小编就和读者们一块来看一下这个问题。



扣丁学堂告诉你Java程序在什么情形下会挂掉



        在本例中,先初始化了一个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方法。


         好了,Java程序在什么情形下会挂掉相信大家已经有所了解了,想要了解Java方面更多信息的话可以登录扣丁学堂官网了解,扣丁学堂不仅有专业的老师和与时俱进的课程体系,还有大量的Java视频教程供学员观看学习哦,想要观看Java视频教程的小伙伴快快登录扣丁学堂吧。Java技术交流群:670348138


关注微信公众号获取更多学习资料

关注微信公众号获取更多学习资料



查看更多关于“Java开发资讯的相关文章>>

标签: 扣丁学堂告诉你Java程序在什么情形下会挂掉 Java培训 Java视频教程 Java开发工程师
扣丁微信
扣丁小程序
15311698296

全国免费咨询热线

邮箱:codingke@1000phone.com

官方群:148715490

北京千锋互联科技有限公司版权所有   北京市海淀区宝盛北里西区28号天丰利商场4层
京ICP备12003911号-6   Copyright © 2013 - 2018
返回顶部 返回顶部