Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >JVM运行时数据区虚拟机栈

JVM运行时数据区虚拟机栈

作者头像
晓果冻
发布于 2022-09-08 06:00:09
发布于 2022-09-08 06:00:09
23200
代码可运行
举报
运行总次数:0
代码可运行

JVM运行时数据区虚拟机栈

虚拟机栈概述

由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。 优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。

Java虚拟机栈是线程私有的,其生命周期与线程相同。每个方法在执行的同时都会创建一个栈帧。

Java虚拟机栈描述的是Java方法执行的内存模型,每一次方法调用都对应着一个栈帧。

  • 这里区分下栈(也就是虚拟机栈)和堆,栈是运行时的单位,而堆是存储的单位。
    • 栈解决程序的运行问题,即程序如何执行,或者说如何处理、生成数据(编译时期)
    • 堆解决的是数据存储的问题,即数据怎么放,放哪里

每个栈帧中都会保存方法的局部标量、操作数栈、动态链接、方法出口等信息。

  • 局部变量表
    • 8种基本数据类型(byte、char、boolean、short、int、float、double、long)
    • 引用类型(数组、类、接口)
  • 操作数栈:主要用于保存计算过程的中间结果,同时作为计算过程中变量临时的存储空间。

栈执行的顺序:先进后出,后进先出

虚拟机栈中可能出现的俩种错误,一种是栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常。另一种是虚拟机栈是可以动态扩展的,如果扩展时无法申请到足够的内存,将会抛出OutOfMemoryError异常。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.company;

public class Main {

    public static void main(String[] args) {
	// write your code here
        //m1();
        m4();
    }
    private static void m4(){
      m4();
    }
    private static String m2(){
        System.out.println("方法2进栈");
        String s = m3();
        System.out.println("方法2出栈");
        return s;
    }

    private static String m3(){
        System.out.println("方法3进栈");
        String s = "";
        System.out.println("方法3出栈");
        return s;
    }

    private static String m1(){
        System.out.println("方法1进栈");
        String s = m2();
        System.out.println("方法1出栈");
        return s;
    }
}

我们可以使用虚拟机参数-Xss 选项来设置线程的最大栈空间,栈的大小直接决定了函数调用的最大可达深度;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-Xss size

设置线程堆栈大小(以字节为单位)。附加字母k或K表示KB,m或M表示MB,和g或G表示GB。默认值取决于平台: Linux / x64(64位):1024 KB macOS(64位):1024 KB Oracle Solaris / x64(64位):1024 KB Windows:默认值取决于虚拟内存

逃逸啥的以后在学,脑瓜疼。。。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
JVM真香系列:轻松掌握JVM运行时数据区
前面我们讲了从java源文件到class文件,在从class文件到JVM。那么今天继续聊JVM是如何布局的。
田维常
2020/11/11
2760
JVM真香系列:轻松掌握JVM运行时数据区
深入浅出JVM(二)之运行时数据区和内存溢出异常
Java虚拟机在运行Java程序时,把所管理的内存分为多个区域, 这些区域就是运行时数据区
菜菜的后端私房菜
2024/09/25
2680
初识java虚拟机(JVM)运行时数据区结构
java虚拟机(JVM)是java平台的基石,任何java程序都是在JVM上运行的。
zhanyd
2022/05/16
2210
初识java虚拟机(JVM)运行时数据区结构
JVM-运行时数据区概述及虚拟机栈
每个线程:独立包括程序计数器、栈、本地栈 线程间共享:堆、堆外内存(永久代活元空间、代码缓存)
是小张啊喂
2022/08/18
4580
JVM之虚拟机栈
由于跨平台性的设计,java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。 优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。
程序员阿杜
2021/06/29
5730
《深入理解java虚拟机》笔记(1)运行时数据区域
1、Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”,墙外面的人想进去,墙里面的人却想出来。
夕阳也是醉了
2023/10/16
1970
《深入理解java虚拟机》笔记(1)运行时数据区域
Java虚拟机--运行时数据区与内存溢出
存放的数据是JVM加载的类信息,常量,静态变量和编译器编译后的代码等,这里要注意的是JDK1.8之后已经将这个方法区删除了,使用元空间,metaspace代替了,理由有如下:
王小明_HIT
2019/08/13
5000
Java虚拟机--运行时数据区与内存溢出
JVM入门——运行时数据区
jdk1.7.0_79    这张图我相信基本上对JVM有点接触的都应该很熟悉,可以说这是JVM入门的第一课。其中的“堆”和“虚拟机栈(栈)”更是耳熟能详。下面将围绕这张图对JVM的运行时数据区做一个
用户1148394
2018/01/12
5700
JVM入门——运行时数据区
JVM 运行时数据区详解
  Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同数据区域。
阿豪聊干货
2018/08/09
3540
JVM 运行时数据区详解
运行时数据区 Krains 2020-08-01
其中虚拟机栈、程序计数器、本地方法栈是线程私有的,也就是说每个线程都会维护自己的一份虚拟机栈、程序计数器、本地方法栈,而方法区和堆是所有线程共享的。
Krains
2020/08/05
3650
运行时数据区  Krains 2020-08-01
JVM虚拟机栈
有不少Java开发人员一提到Java内存结构,就会非常粗粒度地将JVM中的内存区理解为仅有Java堆(heap)和Java战(stack)?为什么?
麋鹿大哥
2020/08/19
7150
JVM运行时数据区域
每个 Java 方法在执行的同时会创建一个栈帧用于存储局部变量表、操作数栈、常量池引用等信息。 从方法调用直至执行完成的过程,就对应着一个栈帧在 Java 虚拟机栈中入栈和出栈的过程。 对于执行引擎来说,活动线程中,只有栈顶的栈帧是有效的,称为当前栈帧,这个栈帧所关联的方法称为当前方法。 执行引擎所运行的所有字节码指令都只针对当前栈帧进行操作。
李红
2019/05/29
4160
Java底层-运行时数据区
在前面关于HotSpot组成中提到,运行时数据区就类似一个工厂,是Java程序运行所在的内存区域,这个区域被JVM所管理,按照虚拟机规范的规定将其划分为:方法区、堆、程序计数器,虚拟机栈、本地方法栈五个部分(在HotSpot虚拟机中虚拟机栈和本地方法栈功能上已经合并) 其中方法区和堆在JVM实例创建的时候就开始创建且分配好内存,我们在启动程序过程中可以通过一些参数设置,比如通过-Xms、-Xmx设置堆大小, JDK7中通过-XX:PermSize、-XX:MaxPermSize设置方法区大小(永久代),JDK8通过-XX:MetaspaceSize=N和 -XX:MaxMetaspaceSize=N设置方法区大小(元空间), 而程序计数器,虚拟机栈,本地方法栈是在线程创建时进行分配,所以方法区、堆是线程共享的,而程序计数器、虚拟机栈、本地方法栈是和线程绑定的,是线程私有的。
每天学Java
2020/07/07
6590
jvm入门2:3-5运行时数据区+程序技术器+虚拟机栈
内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行。jvm内存布局规定了java在运行过程中内存申请、分配、管理的策略,保证了jvm的高效稳定运行。不同的jvm对于内存的划分方式和管理机制存在着部分差异
用户10832809
2025/02/24
1100
java虚拟机栈-由StackOverFlowError引起的思考
在默认栈大小的情况下,多次运行代码,得出的结果是相差不大的。在发生StackOverflowError时,进程并没有结束,因为一个线程的StackOverflowError并不影响整个进程。 现在我们将配置JVM的启动参数-Xss(栈大小),以调整虚拟机栈的大小为256k。如果你是使用idea运行本例代码,可直接在VM options配置加上-Xss256K。如果你是使用java命令运行,可在java命令后面加上-Xss256k。
源码之路
2021/02/04
1.3K0
JVM运行时数据区
Java程序运行时JVM会把内存分为如下图所示的几个区域,其中包括线程所共享的堆、方法区以及线程所独有的虚拟机栈、本地方法栈和程序计数器。
你的益达
2020/08/05
3150
JVM运行时数据区
JVM内存与垃圾回收篇第5章虚拟机栈
https://docs.oracle.com/javase/specs/jvms/se8/html/index.html
yuanshuai
2022/08/22
4540
JVM内存与垃圾回收篇第5章虚拟机栈
JVM:Java运行时数据区域----Java虚拟机栈
前面了解了JVM的程序计数器。通过较为深入的探究,我们发现程序计数器也不过如此。其实技术本无难点,世上无难事,只要肯攀登。 那今天我们开始介绍JVM的第二个重要的组成部分——Java虚拟机栈(JVM Stacks)
鲲志说
2025/04/07
650
JVM:Java运行时数据区域----Java虚拟机栈
Java 虚拟机管理的内存运行时数据区域解释
本文介绍了Java虚拟机内存区域中程序计数器、虚拟机栈、方法区、本地方法栈和Java堆的内存结构和作用,以及OutOfMemoryError异常和内存调优的方法。
李鹏
2017/09/20
7250
Java 虚拟机管理的内存运行时数据区域解释
20张图助你了解JVM运行时数据区,你还觉得枯燥吗?
我们的JVM系列已经断更好几天了,小伙伴们在后台疯狂私信阿Q,想看后续内容,今天它来了。相信大家在上篇文章中已经对类加载子系统有了清晰的认识,接下来就让我们来揭开“运行时数据区”的神秘面纱吧。(文章可能有点长,建议先收藏一波)
阿Q说代码
2021/05/13
6830
20张图助你了解JVM运行时数据区,你还觉得枯燥吗?
相关推荐
JVM真香系列:轻松掌握JVM运行时数据区
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验