All things are difficult before they are easy. 没有软件的裸机是一具僵尸,没有硬件的软件是一个幽灵。2012,专注于Linux和C语言,关注自动化、性能测试,关注开源社区和开源测试工具、方法,尝试测试团队管理!

让JVM Crash的小例子

上一篇 / 下一篇  2010-12-13 00:36:49 / 个人分类:Java

JVM和内存相关的Crash,主要有以下两种:
1.内存回收GC引起的Crash (常见的OutOfMemoryError)
2.栈溢出引起的Crash
  Java代码引起的栈溢出,通常不会引起JVM的Crash,而是抛出一个Java异常:java.lang.StackOverflowError。但是在Java虚拟机中,Java的代码和本地C或C++代码公用相同的Stack。这样,在执行本地代码所造成的栈溢出,就有可能引起JVM的Crash了。

写了一段简单的代码,让JVM出现OutOfMemoryError而Crash;实例代码如下:
OutOfMemory.java
package com.alibaba.practice;

import java.util.ArrayList;

public class OutOfMemory {
    public static void main(String[] args) {
        ArrayList<StubClass> list = new ArrayList<StubClass>();
        int count = 1000000000;
        for (int i = 0; i < count; i++) {
            StubClass bj = new StubClass();
            list.add(obj);
        }
    }
}
StubClass.java
package com.alibaba.practice;

class StubClass {
    private Integer n = new Integer(123334);
    private Integer m = new Integer(123334);
    
    public void print() {
        System.out.println("m="+m);
        System.out.println("n="+n);
    }
}
运行命令:java com/alibaba/practice/OutOfMemory
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
        at com.alibaba.practice.OutOfMemory.main(OutOfMemory.java:10)
话说,我是看到一本书的作者说,在他出去招聘时,就喜欢问应聘者写让JVM Crash的代码,这样来考察应聘者。

如果是Java进程不知道什么原因退出或被杀死,想要分析具体原因,一般来说分下面几步:

1 拿到Java应用程序的日志文件。
一般来说日志文件中会有很应用相关的错误信息。Java进程异常退出的原因最有可能就是应用程序本身的问题。因此检查Java应用程序的日志文件可能是最快定位到错误的方法。

2 查找JVM的致命错误日志
如果应用程序日志文件中没有发现什么线索。那么还可以查看 JVM的致命错误日志。有些致命的错误,比如JNI或虚拟机本身产生的错误,可能使得Java应用程序来不及写日志就退出了。这时候可以查一个以 "hs_err_pid" 开头的日志名,例如hs_err_pid1125.log,其中1125是进程号。这个文件中也记录了一些宝贵的信息来提供一些线索,特别是Java自身 的一些Bug。这个文件一般为于当前的工作目录中。用户可以用find命令自己搜索到。

3 查找操作系统的core dump文件
作为被操作系统所调度的进程,Java进程也会在不同的信号下产生Core Dump文件,例如Sig_ill和Seg_segv。这些非常严重的错误的确会使得Java虚拟机根本来不及产生任何日志就宕了。拿到core dump文件就可以使用很多工具来分析具体原因了,例如jmap, jstack等等都可以友好的进行Java进程的Core文件的分析。一般来说,Core文件也放到进程的当前工作目录,用户可以用find命令搜索 “core”。另外可以用coreadm来预先指定core文件存放的地方以及文件名的格式,例如:coreadm -g /var/core/core.%f.%p.%t

4使用Dtrace查找“是谁杀死了Java进程”
但是,有很多情况,进程被杀死的原因很复杂。有可能被别的进程以外杀掉,或被一些脚本不小心kill掉,或者被管理员(或入侵者kill -9)处理掉。这些情况都不会产生日志文件和core dump文件。这些情况很难跟踪。

更多JVM Crash相关的知识:
http://beck1986.javaeye.com/blog/611479
http://www.ite5e.com/newsinfo.php?nid=3035

TAG: crash java JAVA Java jvm JVM Crash

 

评分:0

我来说两句

smile665

smile665

Stay hungry, stay foolish. 得意之时谨记,一半命运还掌握在上帝手里;失意之时须知,一半命运还掌握在自己手里。

日历

« 2024-03-27  
     12
3456789
10111213141516
17181920212223
24252627282930
31      

数据统计

  • 访问量: 952552
  • 日志数: 220
  • 建立时间: 2008-11-06
  • 更新时间: 2012-10-06

RSS订阅

Open Toolbar