`

诡异的JVM Crash之EXCEPTION_STACK_OVERFLOW

    博客分类:
  • jvm
阅读更多
关于JVM的一个常识是:如果对象被意外地持有很容易造成内存泄漏,而如果同时又在不停地生成新对象,就有很大的机率造成内存溢出。通常情况下,这种溢出会导致JVM抛出OutOfMemoryError,然后JVM挂起。

可是来试试下面的代码,真是让人有点诧异,分别在JDK1.4、JDK5、JDK6上都表现一致。

package crash;

public class JVMCrashTest {



    public static void main(String[] args) {

        try {

            testCrash();

        } catch (Throwable t) {

            t.printStackTrace();

            System.out.println("catch an exception! I'm dead!");

        }

    }



    /**

     * JVM挂掉,core dump

     */

    static void testCrash() {

        Object[] o = null;

        int line = 0;

        while (true) {

            o = new Object[] { o };

            line++;

            if (line % 1000 == 0) {

                System.out.println(line);

            }

        }

    }



}

没有机会抓异常,JVM直接Crash。Windows上会有hs_err日志产生,好一个EXCEPTION_STACK_OVERFLOW。Linux上面连日志都没有,直接segment fault。


static testCrash()V
   L0
    LINENUMBER 13 L0
    ACONST_NULL
    CHECKCAST [Ljava/lang/Object;
    ASTORE 0
   L1
    LINENUMBER 14 L1
    ICONST_0
    ISTORE 1
   L2
    LINENUMBER 15 L2
    NEW java/lang/Object
    DUP
    INVOKESPECIAL java/lang/Object.<init>()V
    ASTORE 2
   L3
    LINENUMBER 17 L3
   FRAME APPEND [[Ljava/lang/Object; I java/lang/Object]
    ICONST_1
    ANEWARRAY java/lang/Object
    DUP
    ICONST_0
    ALOAD 0
    AASTORE
    ASTORE 0
   L4
    LINENUMBER 19 L4
    IINC 1 1
   L5
    LINENUMBER 20 L5
    ILOAD 1
    SIPUSH 1000
    IREM
    IFNE L3
   L6
    LINENUMBER 21 L6
    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
    ILOAD 1
    INVOKEVIRTUAL java/io/PrintStream.println(I)V
   L7
    LINENUMBER 16 L7
   FRAME SAME
    GOTO L3
   L8
    LOCALVARIABLE o [Ljava/lang/Object; L1 L8 0
    LOCALVARIABLE line I L2 L8 1
    LOCALVARIABLE a Ljava/lang/Object; L3 L8 2
    MAXSTACK = 4
    MAXLOCALS = 3


static testCrash()V
   L0
    LINENUMBER 13 L0
    ACONST_NULL
    CHECKCAST [Ljava/lang/Object;
    ASTORE 0
   L1
    LINENUMBER 14 L1
    ICONST_0
    ISTORE 1
   L2
    LINENUMBER 15 L2
    NEW java/lang/Object
    DUP
    INVOKESPECIAL java/lang/Object.<init>()V
    ASTORE 2
   L3
    LINENUMBER 24 L3
    ICONST_1
    ANEWARRAY java/lang/Object
    DUP
    ICONST_0
    ALOAD 0
    AASTORE
    ASTORE 0
   L4
    LINENUMBER 25 L4
    RETURN
   L5
    LOCALVARIABLE o [Ljava/lang/Object; L1 L5 0
    LOCALVARIABLE line I L2 L5 1
    LOCALVARIABLE a Ljava/lang/Object; L3 L5 2
    MAXSTACK = 4
    MAXLOCALS = 3


static testCrash()V
   L0
    LINENUMBER 13 L0
    ACONST_NULL
    CHECKCAST [Ljava/lang/Object;
    ASTORE 0
   L1
    LINENUMBER 15 L1
    NEW java/lang/Object
    DUP
    INVOKESPECIAL java/lang/Object.<init>()V
    ASTORE 1
   L2
    LINENUMBER 24 L2
    ICONST_1
    ANEWARRAY java/lang/Object
    DUP
    ICONST_0
    ALOAD 0
    AASTORE
    ASTORE 0
   L3
    LINENUMBER 25 L3
    ICONST_1
    ANEWARRAY java/lang/Object
    DUP
    ICONST_0
    ALOAD 0
    AASTORE
    ASTORE 0
   L4
    LINENUMBER 26 L4
    RETURN
   L5
    LOCALVARIABLE o [Ljava/lang/Object; L1 L5 0
    LOCALVARIABLE a Ljava/lang/Object; L2 L5 1
    MAXSTACK = 4
    MAXLOCALS = 2


now the last

// access flags 8
  static testCrash()V
   L0
    LINENUMBER 13 L0
    ACONST_NULL
    CHECKCAST [Ljava/lang/Object;
    ASTORE 0
   L1
    LINENUMBER 24 L1
    ICONST_1
    ANEWARRAY java/lang/Object
    DUP
    ICONST_0
    ALOAD 0
    AASTORE
    ASTORE 0
   L2
    LINENUMBER 25 L2
    ICONST_1
    ANEWARRAY java/lang/Object
    DUP
    ICONST_0
    ALOAD 0
    AASTORE
    ASTORE 0
   L3
    LINENUMBER 26 L3
    RETURN
   L4
    LOCALVARIABLE o [Ljava/lang/Object; L1 L4 0
    MAXSTACK = 4
    MAXLOCALS = 1

分享到:
评论

相关推荐

    FSL_LIN_2.X_STACK.zip_FSL_LIN_2.X_STACK_LIN代码_NXP LIN_lin 2.2_li

    《NXP LIN 2.2 Stack:构建与理解》 NXP LIN 2.2 Stack 是一种基于Freescale Semiconductor(现为NXP Semiconductors)技术的 LIN(Local Interconnect Network)通信协议栈,它专为汽车电子系统中的低速通信设计。...

    STACK1_SEGMENT_STACK.rar_STACK1 SEGMENT_stack segment stack

    在汇编语言的学习中,"STACK1_SEGMENT_STACK.rar_STACK1 SEGMENT_stack segment stack"这个标题提到了两个关键概念:栈段(Stack Segment)和栈(Stack)。栈在计算机科学中扮演着至关重要的角色,尤其是在汇编语言...

    IRP与IO_STACK_LOCATION

    ### IRP与IO_STACK_LOCATION详解 #### 一、概述 在Windows驱动开发中,IRP (I/O Request Packet) 和 IO_STACK_LOCATION 是两个至关重要的概念。它们之间存在着密切的关系,通常被视为一个整体来理解。本篇文章旨在...

    FSL_LIN_2.x_STACK_4.5.9.rar_FSL lin_lin_lin 2.2_lin 源码_飞思卡尔 lin

    "FSL_LIN_2.x_STACK_4.5.9.rar_FSL lin_lin_lin 2.2_lin 源码_飞思卡尔 lin" 是一个与飞思卡尔LIN(Local Interconnect Network)协议栈相关的压缩包,主要用于LIN应用的开发和学习。LIN是一种低成本的串行通信协议...

    udp_ip_stack3.zip

    标题“udp_ip_stack3.zip”指的是一个包含Verilog代码实现的UDP/IP协议栈的压缩文件。这个实现已经过硬件板级验证,对于百兆以太网功能完备,而在千兆以太网环境下则需要对设计进行适当的约束优化。在本文中,我们将...

    FSL_LIN_2.x_STACK_Package_4.5.9.7z

    本资源包"**FSL_LIN_2.x_STACK_Package_4.5.9.7z**"专门针对NXP系列芯片,提供了LIN通信的例程和相关工具,是进行LIN通信开发和学习的宝贵资料。 一、NXP芯片与LIN通信 NXP半导体,前身为飞利浦半导体,是一家全球...

    LIN_stack_S12_4_6_6_210629.exe

    NXP 的 LIN 协议栈,之前一直用的 4.5.7 的版本,使用过程中有好几个问题都是手动修复的。最近在官网上看见了 4.6.6 的版本,下载测试了一遍,发现之前手动修复的几个问题都已经 OK 了。

    Z_Stack-1.4.2-NWK.rar_Z_STACK 1.4.2_zigbeenwk层_zigbee网络nwk

    《Zigbee网络层详解——基于Z_Stack 1.4.2的NWK解析》 Zigbee网络层(NWK),是Zigbee通信协议栈中的关键部分,主要负责设备之间的网络通信和管理。在Z_Stack 1.4.2版本中,这一层的实现对于理解Zigbee网络的运作至...

    stack_overflow_exec

    软件漏洞分析入门 相关附件 stack_overflow_exec

    tcpip_stack_v1_2_TCP,IP_TCP_IP_udpmac_UDP_tcp.zip

    《TCP/IP协议栈详解——基于tcpip_stack_v1_2_TCP,IP_TCP_IP_udpmac_UDP_tcp源码分析》 TCP/IP协议栈是互联网通信的基础,它定义了数据在网络中的传输方式。本篇文章将深入剖析名为"tcpip_stack_v1_2_TCP,IP_TCP_IP...

    Pro_MERN_Stack_Full_Stack_Web_App_Development

    首先,这本书的标题是《Pro_MERN_Stack_Full_Stack_Web_App_Development》,其中"MERN"指的是一个流行的全栈Web开发技术栈,它包括了MongoDB(一种NoSQL数据库)、Express.js(一个轻量级Web应用框架)、React(一种...

    可扩展_网络_Stack_for_FPGAs_(TCPIP,_RoCEv2)_

    可扩展_网络_Stack_for_FPGAs_(TCPIP,_RoCEv2)_fpga-Network-Stack_Scalable_Network_Stack_for_FPGAs_(TCPIP,_RoCEv2)_fpga-network-stackfpga-Network-Stack_Scalable_Network_Stack_for_FPGAs_(TCPIP,_RoCEv2)...

    Class_Stack.zip_stack的c++实现

    在C++编程中,栈(Stack)是一种非常重要的数据结构,它遵循“后进先出”(LIFO,Last In First Out)的原则。栈在许多实际应用中都有广泛的应用,如函数调用、表达式求值等。在这个“Class_Stack.zip_stack的c++...

    hart_stack

    HART_STACK参数描述是HART_STACK协议栈接口程序的核心组件之一,它提供了一系列的参数设置接口,用户可以通过这些接口来设置HART设备的参数,例如设备的工作模式、通信速率、数据格式等。 HART_STACK设备初始化函数...

    WndRiver_Network_Stack_VxWorks6_Programmers_Guide

    《WndRiver_Network_Stack_VxWorks6_Programmers_Guide》是一套全面介绍VxWorks操作系统中网络栈编程的指南,分为三个卷,涵盖了Vol.1至Vol.3的内容,版本为6.6。这套指南是针对Wind River公司开发的VxWorks实时操作...

    IO_stack_of_the_Linux_kernel.svg

    linux架构图。...The Linux Storage Stack Diagramversion 4.0, 2015-06-01outlines the Linux storage stack as of Kernel version 4.0 SCSI low level drivers megaraid_sas aacraid qla2xxx ...

    Z_Stack_Home_1.2.2.exe.part2.rar

    TI公司提供2015年最新基于ZigBee无线智能家居开发协议(Z_Stack_Home_1.2.2.exe) 由于只能上传小于60MB文件,将140MB原文件分割3个部分上传,分别为: Z_Stack_Home_1.2.2.exe.part1.rar Z_Stack_Home_1.2.2.exe.part...

    stack_overflow_ret

    软件漏洞分析入门 中的文件 stack_overflow_ret

    linux_thread_stack_size.rar_linux stack size_linux stacksize_thr

    例如,在`sysctl.conf`中添加`kernel.stack_size = 102400`(表示100KB)后,重启系统生效。 值得注意的是,线程栈大小的设置应根据实际应用的需求来确定。对于计算密集型任务,可能需要较大的栈空间以容纳更多的...

Global site tag (gtag.js) - Google Analytics