[转载] java虚拟机 jvm 出入java栈 栈空间内存分配
参考链接: Java虚拟机(JVM)堆栈区域
java栈空间是一块线程私有的内存空间,java堆和程序数据密切相关,那么java栈就是和线程执行密切相关。线程最基本的执行行为就是函数的调用。每次函数调用其实是通过java栈传递数据的。
数据结构中的栈的特性:先进后出,后进先出。FIFO.
java内存中的栈跟数据结构中的特性相似也是FIFO.但是只支持进栈和出栈操作。
java栈中保存的主要内容是栈帧。每一次函数调用都会有对应的栈帧被压进去java栈,执行完毕的时候被弹出java栈。如下图所示。
函数1对应栈帧1,函数2对应栈帧2.函数3对应栈帧3.以此类推。
函数1调用函数2,函数2调用函数3,函数3调用函数4,以此类推。
函数1被调用的时候栈帧1入栈,函数2被调用的时候栈帧2入栈,以此类推。
所以最后被调用的函数在栈顶,也是最先被弹出栈的。
每一个栈帧保存着函数的局部变量、中间运算结果等数据。
函数返回的时候,栈帧从java栈弹出。什么时候函数返回呢?两种情况:
1.正常的return的时候。
2.程序抛出异常。
在一个栈帧内,至少包含局部变量表、操作数帧和帧数据区几部分。
思考的问题:没一次函数调用生成栈帧,从而肯定会占用一定的栈空间。所以栈空间内存不足的时候,函数调用无法进行。当请求的栈深度大于最大栈深度的时候系统会抛出StackOverflowError异常。(内存溢出会在以后的章节深入的讲解和汇总)
java虚拟机制定线程的最大栈空间参数为-Xss,这个参数决定了函数调用的最大深度。
下面一段代码说明,是一个没有出口的递归。这段代码可能会栈溢出错误。如下所示:
private static int count=0;
public static void recursion(){
count++;
recursion();
}
public static void main(String[] args) {
try {
recursion();
} catch (Exception e) {
System.out.println("deep of calling="+count);
e.printStackTrace();
}
}
使用参数-Xss128K执行代码,结果如下:
deep of calling=2020
Exception in thread "main" java.lang.StackOverflowError
at cn.xhgg.test.TestStackDeep.recursion(TestStackDeep.java:6)
使用参数-Xss256K执行代码,结果如下:
count=3665
Exception in thread "main" java.lang.StackOverflowError
at sun.nio.cs.UTF_8.updatePositions(UTF_8.java:77)
两次内存不同对比:
内存增大很明显调用次数增加了。
结论:
函数嵌套的层数很大程度上有栈的大小决定的。栈越大,函数调用的次数就越多。
什么因素影响函数在栈中内存大大小呢?下一个章节介绍(java虚拟机jvm局部变量表)
[转载] java虚拟机 jvm 出入java栈 栈空间内存分配相关推荐
- Java虚拟机学习(7):对象内存分配与回收
对象优先在Eden上分配 大多数情况下,对象优先在新生代Eden区域中分配.当Eden内存区域没有足够的空间进行分配时,虚拟机将触发一次 Minor GC(新生代GC).Minor GC期间虚拟机将E ...
- Java虚拟机(JVM)与Java内存模型(JMM)学习笔记
Java虚拟机[JVM]与Java内存模型[JMM]学习笔记 Java虚拟机(JVM) 三种JVM JVM 位置 JVM的主要组成部分及其作用 类加载器 双亲委派机制 沙箱安全机制 Java本地接口( ...
- 《深入理解java虚拟机》笔记2——GC算法与内存分配策略
说起垃圾收集(Garbage Collection, GC),想必大家都不陌生,它是JVM实现里非常重要的一环,JVM成熟的内存动态分配与回收技术使Java(当然还有其他运行在JVM上的语言,如Sca ...
- java虚拟机jvm与Java内存模型(JMM)
Java内存模型(JMM) Java 内存模型规定了所有的变量都存储在主内存中,每条线程还有自己的工作内存.Java 内存模型(JMM) 抽象了线程和主内存之间的关系,就比如说线程之间的共享变量必须存 ...
- 深入java虚拟机-JVM (java virture mechine)
编程语言的层级关系 文章目录 编程语言的层级关系 JVM内部结构 类加载器 执行引擎 Java栈 .本地方法栈J PC寄存器 方法区(元空间) Java堆 直接内存 电脑硬件–>windows系 ...
- Java虚拟机jvm和Java内存模型jmm浅尝
1. 需要了解的知识 1. 并发编程需要处理两个关键问题 线程同步和通信 2. 线程通信机制有两种 共享内存(隐式)和消息传递(显示) 3. Java中是采用共享内存模型来进行通信 2. 了解Java ...
- Java虚拟机(二)——垃圾回收与内存分配
文章目录 垃圾回收与内存分配 1 引用 2 如何判断对象需要回收 2.1 引用计数算法 2.2 可达性分析算法 2.3 废弃常量的回收 2.4 无用的类的回收 3 内存分配 4 垃圾收集算法 4.1 ...
- java内存分配和垃圾回收_深入理解java虚拟机(二)垃圾收集器与内存分配策略...
垃圾收集器与内存分配策略 垃圾收集,三个步骤 什么时候收集,收集那些,怎么收集 1.收集那些 我们会将一些不使用的对象进行收集,进行回收内存空间,我们怎么知道呢 1.引用计数法 如果这个实例被其他地方 ...
- 《深入理解Java虚拟机》第3章 GC与内存分配策略
GC的历史远远比Java久远. 哪些需要回收? 何时回收? 怎么回收? GC会成为系统达到更高并发量的瓶颈,所以需要对这些"自动化"的技术实施必要的调节. 程序计数器以及两个栈,三 ...
最新文章
- 共享思维导图leangoo,可以导入XMind文件了
- 【原创】rabbitmq-env.conf用户手册(翻译)
- 使用go build 进行条件编译
- C# Winform中慎用Application.DoEvents
- 太妙了!微软670页《dotnet官方手册》火了,完整PDF开放下载!
- ArcGIS 10.7 模型构建器Model Builder空间建模流程化作业案例----影像拼接与掩膜裁剪
- Java正成为COBOL的一部分-它将成为COBOL的一部分吗?
- PSR-2 代码风格规范
- JAVA与DOM解析器基础 学习笔记
- 利用Samba-Winbind组件进行Linux加windows域
- debian9.8无法切换中文输入法
- CSDN出品,必是精品:CSDN浏览器助手!
- 幻读与不可重复读区别
- 提醒电脑族:眼睛酸涩会致病
- 2018最新苹果公司开发者账号设置税务
- vue部署至Tomcat,F5刷新报404问题解决
- 使用 Jupiter Notebook 运行 Delta Lake 入门教程
- 在Excel中批量生成条形码,支持Code128、Code39、Jan13等等格式
- Java数据结构告诉你如何选用数据集合(2)顺序表
- VK11 VK12 保存增强
热门文章
- oracle 实例死掉,Oracle 监听莫名死掉
- PyTorch 分布式训练DDP 单机多卡快速上手
- conda失败说没有写权限_爱情中,为什么男生表白失败,女生还说可以继续做朋友,想过没有...
- Simple Addition expression【打表+二分】
- Spring框架IOC和AOP的实现原理(概念)
- hosts文件不起作用
- HDU 4812 D Tree
- Android 撸起袖子,自己封装 DialogFragment
- CentOS7入门_安装并配置mysql5.7.18
- mysql连接非常慢的觖决办法及其它常见问题解决办法