公司名称:西安达内科技

联系人:张 先生 (seo)

电话:029-82222601

传真:

手机:

编辑Java程序中挂掉是什么原因?

发布时间:05月08日

详细说明

在编辑Java程序中挂掉是为什么呢?下面西安达内Java培训(www.xatarena.cn)讲师为了讲清这个问题,写了一个简单的例子。在本例中,先初始化了一个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" 的错误信息。

西安达内科技


联系人:张 先生 (seo)
电 话:029-82222601
传 真:
手 机:
Q Q:
地 址:中国陕西西安市陕西省西安市兴庆南路10号交大出版大厦6层
邮 编:
网 址:http://xadnitpx.yiwz.com(加入收藏)