欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

通过编写Java代码让Jvm崩溃

程序员文章站 2022-03-10 12:28:36
在书上看到一个作者提出一个问题"怎样通过编写Java代码让Jvm崩溃",我看了之后也不懂。带着问题查了一下,百度知道里面有这样一个答案: 1 package jvm; 2 3 public class Crash { 4 public static void main(String[] args) ......

在书上看到一个作者提出一个问题"怎样通过编写java代码让jvm崩溃",我看了之后也不懂。带着问题查了一下,百度知道里面有这样一个答案:

  1 package jvm;

  2

  3 public class crash {

  4     public static void main(string[] args) {

  5

  6         //object[] o = {"abc"};初始值赋值,不会有影响。

  7         object[] o = null;

  8

  9         while (true) {

  10             o = new object[] { o };

  11             //输出的话,jvm就不会崩溃。

  12             //system.out.println(o);

  13         }

  14     }

  15 }

  程序运行十几秒之后,控制台会出现这样的错误:

  exception in thread "main" java.lang.outofmemoryerror: java 
heap space

  at jvm.crash.main(crash.java:10)

  很明显,超出内存空间错误。

  我将原程序随意改了一下,如赋初始值等,对程序无影响。

  可是我将死循环中的o输出在控制台的时候,jvm居然一直都不崩,为什么输出的话,就不会超出内存空间呢?

  我看来,原程序能够使jvm崩溃,是因为死循环中,通过旧对象,不断创建出新的对象,即创造的对象是互相引用的,所以gc是不会回收它们的,造成堆栈溢出。

  仿照这个例子,我写了一个简单的类,模仿例子程序中的数组,如下:

  1 package jvm;

  2

  3 public class jvmbean {

  4

  5     jvmbean bean = new jvmbean(this);

  6

  7     public jvmbean(jvmbean bean){

  8         this.bean = bean;

  9     }

  10 }

  然后简单测试,如下:

  1 package jvm;

  2

  3 public class mycrash {

  4

  5     public static void main(string[] args) {

  6         jvmbean j = null;

  7         while(true){

  8             j = new jvmbean(j);

  9             //无论输出不输出,jvm都会崩溃

  10             //system.out.println(j);

  11         }

  12     }

  13 }