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.javapackage 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.javapackage 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/OutOfMemoryException 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.%t4使用Dtrace查找“是谁杀死了Java进程”但是,有很多情况,进程被杀死的原因很复杂。有可能被别的进程以外杀掉,或被一些脚本不小心kill掉,或者被管理员(或入侵者kill -9)处理掉。这些情况都不会产生日志文件和core dump文件。这些情况很难跟踪。更多JVM Crash相关的知识:http://beck1986.javaeye.com/blog/611479http://www.ite5e.com/newsinfo.php?nid=3035
收藏
举报
TAG:
crash
java
JAVA
Java
jvm
JVM
Crash