你如何使JVM崩溃?

我正在阅读一本关于编程技巧的书,其中作者问受访者,“你如何使JVM崩溃?” 我认为你可以通过编写一个无限的for循环来最终用完所有的内存。

任何人有任何想法?


最接近单个“答案”的是System.exit() ,它会立即终止JVM而不进行正确的清理。 但除此之外,本机代码和资源耗尽是最可能的答案。 或者,您可以在Sun的bug跟踪器上查看您的JVM版本中的错误,其中一些错误允许可重复的崩溃情况。 在32位版本(我们现在通常使用64位)接近4 Gb内存限制时,我们习惯了半定期崩溃。


我不会调用OutOfMemoryError或StackOverflowError引发崩溃。 这些只是正常的例外。 要真正让虚拟机崩溃,有三种方法:

  • 在本地代码中使用JNI并崩溃。
  • 如果未安装安全管理器,则可以使用反射来使VM崩溃。 这是特定于VM的,但通常VM会在私有字段中存储一堆指向本机资源的指针(例如,指向本地线程对象的指针存储在java.lang.Thread中的长字段中)。 只需通过反射改变它们,虚拟机迟早会崩溃。
  • 所有虚拟机都有错误,所以你只需要触发一个虚拟机。
  • 对于最后一种方法,我有一个简短的例子,它会很好地使Sun Hotspot VM崩溃:

    public class Crash {
        public static void main(String[] args) {
            Object[] o = null;
    
            while (true) {
                o = new Object[] {o};
            }
        }
    }
    

    这会导致GC中的堆栈溢出,因此您将不会得到StackOverflowError,而是包含hs_err *文件的实际崩溃。


    JNI。 事实上,在JNI中,崩溃是默认的操作模式。 你必须加倍努力才能让它不会崩溃。

    链接地址: http://www.djcxy.com/p/19897.html

    上一篇: How do you crash a JVM?

    下一篇: Create a memory leak given an interface to conform to