zoukankan      html  css  js  c++  java
  • 通过编写Java代码让Jvm崩溃

    在书上看到一个作者提出一个问题"怎样通过编写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 }

  • 相关阅读:
    C#=>递归反转栈
    C#=> 栈模仿堆的操作
    C# 栈=>随时读取栈中最小值
    vijos1574 摇钱树
    (二叉)堆
    分块大法好
    list
    动态规划——状压、树形
    区间动规平行四边形优化
    最长公共子序列(LCS)
  • 原文地址:https://www.cnblogs.com/dingzhenor/p/12161498.html
Copyright © 2011-2022 走看看