java虚拟机 jvm 出入java栈 栈空间内存分配
来源:互联网 发布:淘宝开店需要哪些软件 编辑:程序博客网 时间:2024/05/29 08:30
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=2020Exception in thread "main" java.lang.StackOverflowErrorat cn.xhgg.test.TestStackDeep.recursion(TestStackDeep.java:6)
使用参数-Xss256K执行代码,结果如下:
count=3665Exception in thread "main" java.lang.StackOverflowErrorat sun.nio.cs.UTF_8.updatePositions(UTF_8.java:77)
两次内存不同对比:
内存增大很明显调用次数增加了。
结论:
函数嵌套的层数很大程度上有栈的大小决定的。栈越大,函数调用的次数就越多。
什么因素影响函数在栈中内存大大小呢?下一个章节介绍(java虚拟机jvm局部变量表)
- java虚拟机 jvm 出入java栈 栈空间内存分配
- 【Java JVM】Java虚拟机内存分配几个原则
- java jvm 内存分配
- JVM Java内存分配
- java虚拟机内存分配
- Java虚拟机内存分配
- java 虚拟机 内存分配
- Java虚拟机内存分配
- java 虚拟机内存分配
- Java虚拟机内存分配
- Java虚拟机(JVM)及其内存分配的设置
- JVM 虚拟机 (一) Java内存分配 划分与回收
- 深入了解Java虚拟机——JVM内存分配
- JVM虚拟机内存分配
- JVM(4)--java堆和栈、内存分配策略
- JVM--java堆和栈、内存分配策略
- 【Java】【JVM】内存分配机制
- java虚拟机内存分配参数
- 装修过程中的经典工序流程图(三)
- cocos2d-JS (二)Cocos Creater
- HDU1016——Prime Ring Problem(dfs,输入格式)
- ZOJ 2723 Semi-Prime
- (OK) pthread—epoll-loops-on-disconnection-of-a-client—server
- java虚拟机 jvm 出入java栈 栈空间内存分配
- json-lib.jar开发包及依赖包的下载地址
- 使用Hierarchy Viewer分析优化布局性能
- (OK) Linux epoll模型—socket epoll server client chat—pthread
- 事件处理(Java核心技术卷Ⅰ)
- IOS7 隐藏显示状态栏 (电池栏)
- Swift笔记 label 显示富文本或HTML
- 做一个快乐的程序员
- 山东省第一届ACM习题