《深入理解 java 虚拟机》 读书扩展

 作者:淮左白衣

 写于 2018年4月13日16:26:51

目录


java虚拟机栈是什么

平时大家在说 JVM内存 的时候,最常见的说法就是:堆、栈,这种说法很浅显,这里大家理解的栈,就是我们今天讲的java虚拟机栈,或者可能只是虚拟机栈中的 局部变量表 部分;


特点

  1. 线程私有的
  2. 生命周期与线程一致
  3. 每个方法执行的同时,都会在java虚拟机栈中创建一个 栈帧
  4. 会抛出 StackOverflowErrorOutOfMemoryError 异常

栈帧

,每个方法在执行的时候,在内存中的模型就是创建一个栈帧,栈帧是方法运行时的基本数据结构可以理解为栈帧是当前正在运行时的方法的对象;栈帧中存储着方法运行时需要的一些信息:局部变量表、操作数栈、动态链接、方法出口等信息;

(我们后期再去着重理解栈帧,现在只需要知道一些基本概念就好了)

常说入栈出栈,就是栈帧的入栈出栈;


局部变量表

局部变量表中,保存着方法中用到的局部变量(基本数据类型,引用类型)

局部变量表,所占的内存空间在 编译期间 就确定下来了,也就是当方法入栈的时候,栈帧中为方法的局部变量表分配多大空间是完全确定的;你可能会问,假如我程序中有if-else块,那么if块和else块中的变量,会全部算进局部变量表里面吗;答案是肯定的,分支结构中的变量,都会被算进去;

其中long和double占两个局部变量空间(slot),其他类型占用一个slot;因此,我们写的方法,如果方法中的局部变量太多,会占用更大的虚拟机栈空间;


什么时候抛出 StackOverflowErrorOutOfMemoryError 异常

StackOverflowError :当线程申请的栈深度大于虚拟机允许的深度,抛出StackOverflowError 异常;

OutOfMemoryError :假如线程申请的栈深度已经大于虚拟机所允许的深度了,但是虚拟机支持动态扩展 栈的深度,则进行扩展栈的深度,而不是抛 StackOverflowError 异常;最后,假如虚拟机无法获得足够的内存进行栈深度的扩展,则抛出 OutOfMemoryError 异常 ;


后记:本地方法栈

在JVM的内存中,还有一个本地方法栈,它和虚拟机栈的功能基本一样,只是它里面的栈帧,是本地方法对象;它同样抛出 StackOverflowErrorOutOfMemoryError 这两个异常,没啥好说的;

java虚拟机栈(关于java虚拟机内存的那些事)的更多相关文章

  1. 虚拟机栈(Java Stack)基础知识

    虚拟机栈即是程序运行时的单位,而堆是数据存储的单位.换句话说,栈解决的是程序运行的问题,即程序如何执行,如何处理数据,而堆是解决数据的存储问题,数据存在哪,放在哪 虚拟机栈细节如下图所示,其中当前栈帧 ...

  2. Java 内存结构之虚拟机栈

    2.虚拟机栈 定义:虚拟机栈(Java Virtual Machine Stacks)就是每个线程运行需要的内存空间,栈由一个一个的栈帧(Frame)组成,栈帧就是每个方法运行时需要的内存(方法的参数 ...

  3. <<深入Java虚拟机>>-第二章-Java内存区域-学习笔记

    Java运行时内存区域 Java虚拟机在运行Java程序的时候会将它所管理的内存区域划分为多个不同的区域.每个区域都有自己的用途,创建以及销毁的时间.有的随着虚拟机的启动而存在,有的则是依赖用户线程来 ...

  4. 深入理解java虚拟机读书笔记--java内存区域和管理

    第二章:Java内存区域和内存溢出异常 2.2运行时数据区域 运行时数据区分为方法区,堆,虚拟机栈,本地方法栈,程序计数器 方法区和堆是线程共享的区域 虚拟机栈,本地方法栈,程序计数器是数据隔离的数据 ...

  5. 深入理解java虚拟机(一)虚拟机内存划分

    Java虚拟机在执行Java程序时,会把它管理的内存划分为若干个不同的数据区.这些区域有不同的特性,起不同的作用.它们有各自的创建时间,销毁时间.有的区域随着进程的启动而创建,随着进程结束而销毁,有的 ...

  6. Java虚拟机2:Java内存区域

    1.几个计算机的概念 为以后写文章考虑,也为巩固自己的知识和一些基本概念,这里要理清楚几个计算机中的概念. 1.计算机存储单位 从小到大依次为位Bit.字节Byte.千字节KB.兆M.千兆GB.TB, ...

  7. Java虚拟机栈---本地方法栈

    1.Java虚拟机栈(Java Virtual Machine Stacks) 线程私有,它的生命周期与线程相同.描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧(Stack ...

  8. 深入学习重点分析java基础---第一章:深入理解jvm(java虚拟机) 第一节 java内存模型及gc策略

    身为一个java程序员如果只会使用而不知原理称其为初级java程序员,知晓原理而升中级.融会贯通则为高级 作为有一个有技术追求的人,应当利用业余时间及零碎时间了解原理 近期在看深入理解java虚拟机 ...

  9. 深入理解JVM虚拟机11:Java内存异常原理与实践

    本文转自互联网,侵删 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutori ...

  10. JVM运行时数据区--Java虚拟机栈

    虚拟机栈的背景 由于跨平台性的设计,java的指令都是根据栈来设计的.不同平台CPU架构不同,所以不能设计为基于寄存器的. 根据栈设计的优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样 ...

随机推荐

  1. @babel/preset-env useBuiltIns 说明

    推荐阅读:https://blog.hhking.cn/2019/04/02/babel-v7-update/ useBuiltIns false 1 "useBuiltIns": ...

  2. 一个Maven项目在eclipse中正常,但在IDEA中启动时报错

    这个项目十有八九最初是在ecplise创建的,框架上十有八九整合了Mybatis,报的错误十有八九是 org.apache.ibatis.binding.BindingException: Inval ...

  3. mui Picker DtPicker 固定内容以及变动内容Picker 不同情况下的应用 提高效率

    目的是: 保证不同的Picker只创建一次,多次创建Picker系统不会自己销毁,X掉一个之后后面可能会出现下一个. 保证实现需求的情况下,优化代码,提高效率. 1.如果picker中的内容为定值 v ...

  4. WPF中打开网页的两种方法

    1.浏览器打开 Process proc = new System.Diagnostics.Process(); proc.StartInfo.FileName = "http://www. ...

  5. C语言的历史

    1.ALGOL语言 ALGOL ,为算法语言(ALGOrithmic Language)的缩写,是计算机发展史上首批产生的高级程式语言家族.当时还是晶体管计算机流行的时代,由于ALGOL语句和普通语言 ...

  6. Android填坑—Error:Execution failed for task ':app:transformClassesWithDexForRelease'

    昨晚正在干着自己的事,另外一个同学说项目打包不了,但是可以debug运行.又急着需要打包apk发给那边人去测试.真的是搞事情,赶紧打开项目试试打包.项目从之前的$Eclipse$中转过来的,清楚的记得 ...

  7. vue 弹窗式 滑动图片验证码

    效果图: 具体代码: test.vue //整个页面是个弹窗 visible 控制弹窗的显示关闭 默认打开 <template> <div class="mask_laye ...

  8. java Calendar 小时值得到24进制格式

    Calendar cal = Calendar.getInstance(); cal.get(Calendar.HOUR_OF_DAY)

  9. 解决问题:OSError: mysql_config not found

    通过pip install mysqlclient时报出了OSError: mysql_config not found错误,如下 Traceback (most recent call last): ...

  10. php-图片加水印和文字

    //************************** 图片加文字 ************************ $dst_path = '11.jpg';//创建图片的实例$dst = ima ...