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架构不同,所以不能设计为基于寄存器的. 根据栈设计的优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样 ...
随机推荐
- Zabbix监控win10系统
Zabbix监控win10系统 1. 在win10下安装zabbix-agent zabbix-agent下载地址:https://www.zabbix.com/downloads/4.2.6/zab ...
- js 删除节点
亲身经历,寻得此法,告知大家=============== 在javascript操作dom树的时候可能会经常遇到增加,删除节点的事情,比如一个输入框后一个增加按钮,一个删除按钮,点击增加就增加 个输 ...
- zookeeper 随记
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务. zookeeper的几种模式: 1.单点模式 2.分布式集群模式,节点运行在多台机器 3.单点多实例 在这里只介绍单点多实例安装. ...
- linux red hat下安装tomcat的过程
linux下安装tomcat <-----------1.0----------------->:首先需要先去tomcat官网下载linux版本的tomcat的安装包; 我在官网上下载的 ...
- scp执行报错WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
linux环境执行scp时会遇到报错WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!,如下 [root@subsname home]# scp AAA. ...
- Go by Example-流控制语句之if/else
Go by Example-流控制语句之if/else Go中的if/else的用法和其他语言没什么区别,在格式要求上保留了类似Python中的一些特性. 基本概念 在条件判断语法 if/else 中 ...
- T-MAX—项目系统设计与数据库设计
团队作业第四次-项目系统设计与数据库设计 这个作业属于哪个课程 2019秋福大软件工程实践Z班 这个作业要求在哪里 团队作业第四次-项目系统设计与数据库设计 团队名称 T-MAX 这个作业的目标 在开 ...
- c语言复杂申明解释程序
c语言复杂声明的解释 目标:分析一个将c语言复杂申明解释为英语的一个程序 首先介绍一种简单的读声明的方法,来源网络 1.右左法则 从标识符开始(或者最内层的结构,如果不存在标识符的话,通常出现于函数指 ...
- 使用RESTful风格开发
什么是RESTful风格? REST是REpresentational State Transfer的缩写(一般中文翻译为表述性状态转移),REST 是一种体系结构,而 HTTP 是一种包含了 RES ...
- grub下如何指定哪个分区为根文件系统?
答: 使用root命令,如: grub> set root=(hd0,msdos1)