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 }

  • 相关阅读:
    UPDATE 时主键冲突引发的思考【转】
    MySQL Sandbox安装使用
    主从复制1062错误解决方法
    InnoDB log file 设置多大合适?
    EXPLAIN 命令详解
    【机器学习】ID3算法构建决策树
    连续属性离散化处理
    【机器学习】决策树基础知识
    【机器学习】模型评估与选择
    【机器学习】单层感知器
  • 原文地址:https://www.cnblogs.com/dingzhenor/p/12161498.html
Copyright © 2011-2022 走看看