参考链接: 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栈 栈空间内存分配相关推荐

  1. Java虚拟机学习(7):对象内存分配与回收

    对象优先在Eden上分配 大多数情况下,对象优先在新生代Eden区域中分配.当Eden内存区域没有足够的空间进行分配时,虚拟机将触发一次 Minor GC(新生代GC).Minor GC期间虚拟机将E ...

  2. Java虚拟机(JVM)与Java内存模型(JMM)学习笔记

    Java虚拟机[JVM]与Java内存模型[JMM]学习笔记 Java虚拟机(JVM) 三种JVM JVM 位置 JVM的主要组成部分及其作用 类加载器 双亲委派机制 沙箱安全机制 Java本地接口( ...

  3. 《深入理解java虚拟机》笔记2——GC算法与内存分配策略

    说起垃圾收集(Garbage Collection, GC),想必大家都不陌生,它是JVM实现里非常重要的一环,JVM成熟的内存动态分配与回收技术使Java(当然还有其他运行在JVM上的语言,如Sca ...

  4. java虚拟机jvm与Java内存模型(JMM)

    Java内存模型(JMM) Java 内存模型规定了所有的变量都存储在主内存中,每条线程还有自己的工作内存.Java 内存模型(JMM) 抽象了线程和主内存之间的关系,就比如说线程之间的共享变量必须存 ...

  5. 深入java虚拟机-JVM (java virture mechine)

    编程语言的层级关系 文章目录 编程语言的层级关系 JVM内部结构 类加载器 执行引擎 Java栈 .本地方法栈J PC寄存器 方法区(元空间) Java堆 直接内存 电脑硬件–>windows系 ...

  6. Java虚拟机jvm和Java内存模型jmm浅尝

    1. 需要了解的知识 1. 并发编程需要处理两个关键问题 线程同步和通信 2. 线程通信机制有两种 共享内存(隐式)和消息传递(显示) 3. Java中是采用共享内存模型来进行通信 2. 了解Java ...

  7. Java虚拟机(二)——垃圾回收与内存分配

    文章目录 垃圾回收与内存分配 1 引用 2 如何判断对象需要回收 2.1 引用计数算法 2.2 可达性分析算法 2.3 废弃常量的回收 2.4 无用的类的回收 3 内存分配 4 垃圾收集算法 4.1 ...

  8. java内存分配和垃圾回收_深入理解java虚拟机(二)垃圾收集器与内存分配策略...

    垃圾收集器与内存分配策略 垃圾收集,三个步骤 什么时候收集,收集那些,怎么收集 1.收集那些 我们会将一些不使用的对象进行收集,进行回收内存空间,我们怎么知道呢 1.引用计数法 如果这个实例被其他地方 ...

  9. 《深入理解Java虚拟机》第3章 GC与内存分配策略

    GC的历史远远比Java久远. 哪些需要回收? 何时回收? 怎么回收? GC会成为系统达到更高并发量的瓶颈,所以需要对这些"自动化"的技术实施必要的调节. 程序计数器以及两个栈,三 ...

最新文章

  1. 共享思维导图leangoo,可以导入XMind文件了
  2. 【原创】rabbitmq-env.conf用户手册(翻译)
  3. 使用go build 进行条件编译
  4. C# Winform中慎用Application.DoEvents
  5. 太妙了!微软670页《dotnet官方手册》火了,完整PDF开放下载!
  6. ArcGIS 10.7 模型构建器Model Builder空间建模流程化作业案例----影像拼接与掩膜裁剪
  7. Java正成为COBOL的一部分-它将成为COBOL的一部分吗?
  8. PSR-2 代码风格规范
  9. JAVA与DOM解析器基础 学习笔记
  10. 利用Samba-Winbind组件进行Linux加windows域
  11. debian9.8无法切换中文输入法
  12. CSDN出品,必是精品:CSDN浏览器助手!
  13. 幻读与不可重复读区别
  14. 提醒电脑族:眼睛酸涩会致病
  15. 2018最新苹果公司开发者账号设置税务
  16. vue部署至Tomcat,F5刷新报404问题解决
  17. 使用 Jupiter Notebook 运行 Delta Lake 入门教程
  18. 在Excel中批量生成条形码,支持Code128、Code39、Jan13等等格式
  19. Java数据结构告诉你如何选用数据集合(2)顺序表
  20. VK11 VK12 保存增强

热门文章

  1. oracle 实例死掉,Oracle 监听莫名死掉
  2. PyTorch 分布式训练DDP 单机多卡快速上手
  3. conda失败说没有写权限_爱情中,为什么男生表白失败,女生还说可以继续做朋友,想过没有...
  4. Simple Addition expression【打表+二分】
  5. Spring框架IOC和AOP的实现原理(概念)
  6. hosts文件不起作用
  7. HDU 4812 D Tree
  8. Android 撸起袖子,自己封装 DialogFragment
  9. CentOS7入门_安装并配置mysql5.7.18
  10. mysql连接非常慢的觖决办法及其它常见问题解决办法