| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> 【JVM】内存布局-虚拟机栈-栈帧 -> 正文阅读 |
|
[Java知识库]【JVM】内存布局-虚拟机栈-栈帧 |
文章福利:阿里巴巴编码规范-各版本下载 每一个方法的运行都伴随着栈帧的入栈到出栈过程,那么栈帧中有什么呢? 既然每个方法都被映射成一个个栈帧,方法中有什么则栈帧中或多或少都应该也有什么吧,思路是没问题的。 方法中有什么呢? 如下是一个很普通的方法:
该方法中包含如下信息:
栈帧中有什么呢? 对比上述方法中包含的信息,那么栈帧中应当有存储方法里的参数、局部变量、返回值等信息的数据结构及其他细节信息,答案是肯定的。 明白了栈帧的设计是为了运行时方法信息的存储,下面就来看看栈帧中具体包含那些信息 一个栈帧中应当包含以下信息: 局部变量表、操作数栈、动态链接、返回值信息和其他信息。 本篇暂不打算说栈帧中的的局部变量表等信息,本篇和小伙伴们大致学习了解下对栈帧的初步印象。 关于栈帧的其他重要信息 当一个线程中的方法调用链很长的时候,其对应的栈帧数量也就很多,每个栈帧都占有一定大小的空间,在代码编译期每个方法对应的栈帧大小就已经确定,而虚拟机栈的大小是不确定的,一般一个线程栈默认大小为1MB,可以修改该值。 这里一定要注意,编译期只是确定了栈帧中需要多大的变量表,而程序运行后需要多大的虚拟机栈内存是不知道的,这样就会出现一种问题: 不正确的递归调用会导致栈内存溢出(stackoverflow),因为不正确的使用递归,运行期间递归方法一直在循环调用,每个占用的栈帧空间一直没有被释放,调用次数到达虚拟机栈内存的最大内存后就会出现栈溢出的情况。 递归导致栈溢出演示:
运行结果:
栈的OOM情况 若虚拟机栈有一个动态扩展内存机制,线程申请的栈内存空间大于预设值,先去动态扩展内存,若扩展后还是不够线程申请的栈内存大小,此时就会内存溢出 然而,栈的OOM情况有些虚拟机是没有实现的,比如我们常见的HotSpot 附:Java虚拟机规范关于栈的异常:
--- END --- 关注公众号?Java岛?,每天进步亿点点,和小编一起成长Java呀! |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 | -2025/1/31 7:28:13- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |