1.JVM内存溢出之虚拟机栈和本地方法栈溢出

1.

理论支持依据有:

 当方法被调用的时候,创建栈帧,并压入虚拟机栈,方法执行完毕之后
* 栈阵出栈并且被销毁

详细过程如下图所示:

虚拟机栈有一个十分明显的特点是隔离性是十分的好的:

每个线程都有自己独立的虚拟机栈

其中虚拟机栈的StackOverflowError原理如下所示:

  若单个线程请求的栈深度大于虚拟机允许的深度,则会抛出StackOverflowError(栈溢出错误)

JVM会为每个线程的虚拟机栈分配固定大小的内存(-Xss参数)。所以栈能够容纳的栈帧数量是有限的,若栈帧不断进栈而不出栈,最终会导致当前线程虚拟机栈的内存空间耗尽,典型如一个无结束条件的递归函数调用,

递归函数调用代码实现如下所示:

具体过程如下所示:

显示如下所示:

由于内部定义的是一个void的内部无返回值的构造方法,会不断的去迭代自己本身的构造方法,也就是内部迭代的一个过程

/**
 * 虚拟机栈内存溢出测试。栈内存也就是我们经常说的虚拟机内存
 * 可以理解为虚拟机中栈顶指针的局部变量集合
 *
 *
 */
public class javaVMStackSOF {
private int stacklength=1;
public void stackleak(){
    stacklength ++;
    stackleak();//不断的去内存调用,也就是自己不断的去调用自己
    //通过不断往栈中压入方法来实现。定义void 参数来实现不断的内部调用
}

public static void main(String[] args){
    javaVMStackSOF oom=new javaVMStackSOF();
    try {
        /**
         * 当方法被调用的时候,创建栈帧,并压入虚拟机栈,方法执行完毕之后
         * 栈阵出栈并且被销毁
         */
        oom.stackleak();
    }catch (Throwable e){
        System.out.println("stack length:"+oom.stacklength);
        throw e;
    }
}
}

具体实现的验证代码如上所示:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值