java自己寫的一個小程式
阿新 • • 發佈:2019-02-10
今天在書上看到一個作者提出一個問題"怎樣通過編寫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是不會回收它們的,造成堆疊溢位。