JVM进阶(一)——初识JAVA栈
来源:互联网 发布:c语言scanf用法 编辑:程序博客网 时间:2024/05/22 14:04
JVM进阶(一)——初识JAVA栈
若想使自己编写的Java程序高效运行,以及进行正确、高效的异常诊断,JVM是不得不谈的一个话题。本”JVM进阶“专栏大部分内容均来源于经典书籍《深入理解Java虚拟机》。
下面言归正传,本文重点从虚拟机内存模型(运行时数据区域)入手。先看图:
这是一张比较官方的虚拟机模型图,今天讲的就是虚线框中栈的部分。
栈是我们最常用的内存区域。它主要用来存放基本类型变量,局部变量以及对象的引用。例如:User user = new User();这里的user就是对象的引用也可以理解为地址,指引着虚拟机要去哪里找user这个对象。 他们的基本关系如图:
由图可知,当我们将一个对象作为方法的参数时,我们在方法中改变对象的值,也会影响到原来的对象的值,因为我们只是改变了图中内存区域的值,他的指引(地址)还是一样的。同时也可以看出,栈的内存区域是连续的,有大小限制的,如果超过了就会抛出栈溢出的异常StackOverflowError。
在每个方法执行的时候,都会创建一个个的栈帧,用于保存局部变量表,操作数栈,动态链接等信息(以后都会详细讲解)。每次方法的调用都会对应着一个栈帧,因此可以解释有我们在写递归程序的时候会不小心报栈溢出的异常,因为栈是有限的,方法调用太多次导致栈帧堆满了栈,所以溢出。看下面代码:
在参数-Xss128k的情况下的报错。(eclipse中设置参数:右键代码选择Run As–>Run Configurations,在Arguments栏下的VM arguments中填入参数,再Apply,再run)
每次在方法执行完毕的时候,虚拟机会自动释放掉为该栈所分配的空间,在栈中,对应着一个栈帧的出栈。虚拟机会自动分配与回收内存,因此效率比较高。
最后做一下栈的总结:
- 存放基本类型变量,局部变量,对象的引用;
- 系统自动分配与回收内存,效率较高,快速,存取速度比堆要快;
- 是一块连续的内存的区域,有大小限制,如果超过了就会栈溢出,并抛出栈溢出的异常StackOverflowError;
- Java会自动释放掉为该变量所分配的内存空间;
栈又分为java栈和本地方法栈。顾名思义,本地方法栈自然就是为本地方法提供服务的,java栈是为java服务的。
注意,JVM栈是每个线程私有的!
声明:本文图片转载于”这堆干货有点猛“。
- JVM进阶(一)——初识JAVA栈
- JVM进阶(一)——初识JAVA栈
- JVM进阶(二)——初识JAVA堆
- JVM进阶(十四)——初识JAVA 类加载机制
- JVM进阶(二)——初识JAVA堆
- JVM进阶(十四)——初识JAVA 类加载机制
- JVM进阶(十八)——初识Class文件
- JVM进阶(十八)——初识Class文件
- 【Java进阶】——初识数据库连接池
- JVM笔记——初识
- JVM进阶系列一
- JVM 进阶 一
- JVM进阶(五)——JAVA GC之标记
- JVM进阶(九)——JAVA 年轻代收集器
- JVM进阶(十)——JAVA 年老代收集器
- JVM进阶(十一)——JAVA G1收集器
- JVM进阶(十二)——JAVA 可视化分析工具
- JVM进阶(十五)——JAVA 类加载器
- bzoj 3698: XWW的难题 (有源汇有上下界的最大流)
- 17-Oracle入门之表的管理
- C++不常用关键字
- 小程序制作回到顶部按钮
- linux安装jdk后发现系统带有openjdk的处理
- JVM进阶(一)——初识JAVA栈
- DRUID连接池的实用 配置详解
- 使用MUlTISIM实现60进制计数器
- 1.jquery 遍历对象
- tensorflow学习笔记
- 组合对象的初始化列表
- 热烈庆祝数通畅联成立三周年!
- css height width padding margin 百分比取值的基准问题
- python enumerate用法总结