java虚拟机栈(关于java虚拟机内存的那些事)
《深入理解 java 虚拟机》 读书扩展
作者:淮左白衣
写于 2018年4月13日16:26:51
目录
java虚拟机栈是什么
平时大家在说 JVM内存 的时候,最常见的说法就是:堆、栈,这种说法很浅显,这里大家理解的栈,就是我们今天讲的java虚拟机栈,或者可能只是虚拟机栈中的 局部变量表 部分;
特点
- 线程私有的
- 生命周期与线程一致
- 每个方法执行的同时,都会在java虚拟机栈中创建一个
栈帧 - 会抛出
StackOverflowError、OutOfMemoryError异常
栈帧
,每个方法在执行的时候,在内存中的模型就是创建一个栈帧,栈帧是方法运行时的基本数据结构,可以理解为栈帧是当前正在运行时的方法的对象;栈帧中存储着方法运行时需要的一些信息:局部变量表、操作数栈、动态链接、方法出口等信息;
(我们后期再去着重理解栈帧,现在只需要知道一些基本概念就好了)
常说入栈出栈,就是栈帧的入栈出栈;
局部变量表
局部变量表中,保存着方法中用到的局部变量(基本数据类型,引用类型);
局部变量表,所占的内存空间在 编译期间 就确定下来了,也就是当方法入栈的时候,栈帧中为方法的局部变量表分配多大空间是完全确定的;你可能会问,假如我程序中有if-else块,那么if块和else块中的变量,会全部算进局部变量表里面吗;答案是肯定的,分支结构中的变量,都会被算进去;
其中long和double占两个局部变量空间(slot),其他类型占用一个slot;因此,我们写的方法,如果方法中的局部变量太多,会占用更大的虚拟机栈空间;
什么时候抛出 StackOverflowError 、OutOfMemoryError 异常
StackOverflowError :当线程申请的栈深度大于虚拟机允许的深度,抛出StackOverflowError 异常;
OutOfMemoryError :假如线程申请的栈深度已经大于虚拟机所允许的深度了,但是虚拟机支持动态扩展 栈的深度,则进行扩展栈的深度,而不是抛 StackOverflowError 异常;最后,假如虚拟机无法获得足够的内存进行栈深度的扩展,则抛出 OutOfMemoryError 异常 ;
后记:本地方法栈
在JVM的内存中,还有一个本地方法栈,它和虚拟机栈的功能基本一样,只是它里面的栈帧,是本地方法对象;它同样抛出 StackOverflowError 、OutOfMemoryError 这两个异常,没啥好说的;
java虚拟机栈(关于java虚拟机内存的那些事)的更多相关文章
- 虚拟机栈(Java Stack)基础知识
虚拟机栈即是程序运行时的单位,而堆是数据存储的单位.换句话说,栈解决的是程序运行的问题,即程序如何执行,如何处理数据,而堆是解决数据的存储问题,数据存在哪,放在哪 虚拟机栈细节如下图所示,其中当前栈帧 ...
- Java 内存结构之虚拟机栈
2.虚拟机栈 定义:虚拟机栈(Java Virtual Machine Stacks)就是每个线程运行需要的内存空间,栈由一个一个的栈帧(Frame)组成,栈帧就是每个方法运行时需要的内存(方法的参数 ...
- <<深入Java虚拟机>>-第二章-Java内存区域-学习笔记
Java运行时内存区域 Java虚拟机在运行Java程序的时候会将它所管理的内存区域划分为多个不同的区域.每个区域都有自己的用途,创建以及销毁的时间.有的随着虚拟机的启动而存在,有的则是依赖用户线程来 ...
- 深入理解java虚拟机读书笔记--java内存区域和管理
第二章:Java内存区域和内存溢出异常 2.2运行时数据区域 运行时数据区分为方法区,堆,虚拟机栈,本地方法栈,程序计数器 方法区和堆是线程共享的区域 虚拟机栈,本地方法栈,程序计数器是数据隔离的数据 ...
- 深入理解java虚拟机(一)虚拟机内存划分
Java虚拟机在执行Java程序时,会把它管理的内存划分为若干个不同的数据区.这些区域有不同的特性,起不同的作用.它们有各自的创建时间,销毁时间.有的区域随着进程的启动而创建,随着进程结束而销毁,有的 ...
- Java虚拟机2:Java内存区域
1.几个计算机的概念 为以后写文章考虑,也为巩固自己的知识和一些基本概念,这里要理清楚几个计算机中的概念. 1.计算机存储单位 从小到大依次为位Bit.字节Byte.千字节KB.兆M.千兆GB.TB, ...
- Java虚拟机栈---本地方法栈
1.Java虚拟机栈(Java Virtual Machine Stacks) 线程私有,它的生命周期与线程相同.描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧(Stack ...
- 深入学习重点分析java基础---第一章:深入理解jvm(java虚拟机) 第一节 java内存模型及gc策略
身为一个java程序员如果只会使用而不知原理称其为初级java程序员,知晓原理而升中级.融会贯通则为高级 作为有一个有技术追求的人,应当利用业余时间及零碎时间了解原理 近期在看深入理解java虚拟机 ...
- 深入理解JVM虚拟机11:Java内存异常原理与实践
本文转自互联网,侵删 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutori ...
- JVM运行时数据区--Java虚拟机栈
虚拟机栈的背景 由于跨平台性的设计,java的指令都是根据栈来设计的.不同平台CPU架构不同,所以不能设计为基于寄存器的. 根据栈设计的优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样 ...
随机推荐
- mysql 修改表结构以支持事务操作
修改表的类型为 INNODB 的 SQL: alter table category_ ENGINE = innodb; 查看表的类型的 SQL show table status from ...
- journalnode Can't scan a pre-transactional edit log 异常处理
由于数据磁盘爆满,达到100%,导致journalnode宕掉,在启动journalnode以后,查看日志,提示Can't scan a pre-transactional edit log,这个时候 ...
- EXTJS框架-入门实例
extjs框架是一个JavaScript框架,可以渲染出丰富的控件 实例: 代码: <html> <head> <title>test</title> ...
- Hive和Hadoop
我最近研究了hive的相关技术,有点心得,这里和大家分享下. 首先我们要知道hive到底是做什么的.下面这几段文字很好的描述了hive的特性: 1.hive是基于Hadoop的一个数据仓库工具,可以将 ...
- BaggingClassifier
写在前面 Ensemble methods 组合模型的方式大致为四个:/bagging / boosting / voting / stacking ,此文主要简单叙述 bagging算法. 算法 ...
- 网络中的tarpit/tar pit
最近看haproxy源码,里面有个TARPIT的概念不能理解,找了很久才找到对应的意思.特此记录. tarpit 本意是“沼泽地.地洼地”,这里显然把它引申为“捕获或者困住某个物体”. 在网络语义中提 ...
- VMware vSphere Client中启动虚拟机提示No boot filename received/Operating System not found解决方法
昨天下载安装 .NET Framework 3.5 SP1解决了VMware vSphere Client安装问题后,今天需要远程连接服务器搭建一台虚拟机. 根据指引步骤进行下一步.下一步的操作完成后 ...
- Ionic4.x 中的 UI 组件(UI Components) 日期组件
1.日期组件的基本使用 官方文档:https://ionicframework.com/docs/api/datetime 模板中: <ion-datetime display-format=& ...
- Elasticsearch(ELK)集群搭建
一.前言 Elasticsearch是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储.检索数据:本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据.Elasticsearch也使用 ...
- python 中密码处理函数
一个简单的对某字符串进行 MD5加密 import hashlib def md5_pwd(pwd): """ 为了防止解密,hashlib.md5时加入自己的字段 将密 ...