我是靠谱客的博主 酷酷店员,最近开发中收集的这篇文章主要介绍JVM内存结构中--虚拟机栈的结构,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

    • 虚拟机栈的结构
      • 栈帧
        • 局部变量区
        • 操作数栈
        • 动态连接
        • 方法返回地址
      • 该内存区域的异常情况
      • 如何查看栈的深度

虚拟机栈的结构

每一个线程调用的时候,都会生成一个专门的虚拟机栈来处理这个线程的方法调用链。
在这里插入图片描述

栈帧

栈内部是由一个个栈帧组成的。每一个栈帧是一个方法的数据结构。我们调用方法的时候就会执行入栈的操作,方法执行完后就会执行出栈的操作。而在栈中表示这些方法的名字就是栈帧。

局部变量区

也可以说是局部变量表。可以想象一下我们写的方法,方法的参数、内部定义的变量就是存在于这个区域的。

操作数栈

操作数栈,同样也是先入后出的。是用来存放一些局部变量。方法中向其它方法传的参数也存在这,调用其它方法后的返回值也存在这。
栈的大小称为字宽,在64为虚拟机中,1字宽=8字节。

动态连接

代表运行时常量池的引用。

方法返回地址

一个方法被执行后,有两种方法退出这个方法。
第一种方法是,执行引擎遇到一个代表返回的指令,这种退出称为正常完成出口
第二种方法是,在执行过程中出现了异常,且该方法不存在处理该异常的能力,那么也会导致方法退出,这种退出称为异常完成出口
但是无论哪种退出方法,都必须退回到方法调用的开始地址,才能保证程序继续往下执行。

该内存区域的异常情况

  • 如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常
  • 如果Java虚拟机栈容量可以动态扩容,当栈无法申请到足够的内存将会抛出OutOfMemoryError。

在我们现在常用的jdk,其使用的虚拟机是HotSpot,它是一种不可以动态扩展的。所以,只要线程申请栈空间成功了就不会有OOM,只有申请失败的时候,才会有OOM。

如何查看栈的深度

一个方法进行自调用,并使用Throwable抛出异常时,打印栈深度。

public class test {

	private static int count=0;
	public static void main(String[] args) {
		try {
			test(1,2,3,4);
		}catch (Throwable e){
			System.out.println(count);
		}

	}
	public static void test(int a,int b,int c,int d){
		count++;
			test(a,b,c,d);
	}
}

最后

以上就是酷酷店员为你收集整理的JVM内存结构中--虚拟机栈的结构的全部内容,希望文章能够帮你解决JVM内存结构中--虚拟机栈的结构所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(59)

评论列表共有 0 条评论

立即
投稿
返回
顶部