文档章节

JVM学习总结(一)运行时数据区

hensemlee
 hensemlee
发布于 04/22 11:46
字数 1556
阅读 63
收藏 25
点赞 0
评论 0

《深入Java虚拟机》这本书买了有一段时间了,当时看的时候就只是看,并没有边看边总结啥的,最后发现到脑子里面的根本所剩无几了。现在开始要好好归纳总结地再学习一遍。

运行时数据区域

JVM在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。所管理的内存包括以下几个运行时数据区域

输入图片说明

  1. 程序计数器
  • 作用:记录当前线程所执行的字节码的行号。字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令
  • 意义:JVM的多线程是通过线程轮流切换并分配CPU时间方式来实现的,因此,为了线程切换后能恢复到正确的指定位置,每条线程丢都需要一个独立的程序计数器
  • 存储内容 : 若线程正执行的是一个Java方法时,程序计数器中记录的是正在执行的线程的虚拟机字节码指令的地址 若线程正执行的是一个本地方法时,程序计数器中的值为空
  • 可能发生的异常: 程序计数器是唯一一个Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域
  1. Java虚拟机栈
  • 作用:描述Java方法执行的内存模型,每个方法执行的时候都会创建一个栈帧,栈帧里面存储了局部变量表、操作数栈、动态链接、方法出口等信息
  • 意义:方法从开始执行到执行结束,就对应着一个栈帧在Java虚拟机栈中入栈到出栈的过程
  • 存储内容: 局部变量表(编译期间可知的各种基本数据类型、引用类型和指向一条字节码指令的returnAddress类型)、操作数栈、动态链接、方法出口等信息 值得注意的是:局部变量表所需的内存空间在编译期间完成分配。在方法运行的阶段是不会改变局部变量表的大小的
  • 可能发生的异常: StackOverflowError异常:如果线程请求的栈深度大于虚拟机所允许的深度,将抛出该异常 OutOfMemoryError异常:如果虚拟机栈可以动态扩展(当前大部分的Java虚拟机都可以动态扩展,只不过虚拟机规范中也允许固定长度的虚拟机栈)如果扩展时无法申请到足够的内存,就会抛出该异常
  1. 本地方法栈
  • 作用:为JVM所调用到的Native即本地方法服务 ps:Sun HotSpot虚拟机 直接把本地方法栈和虚拟机栈合二为一
  • 可能发生的异常:同虚拟机栈,存在StackOverflowError异常和OutOfMemoryError异常
  1. Java堆
  • 作用:分配所有的对象实例以及数组,但随着即时编译(JIT)器的发展与逃逸分析技术逐渐成熟,栈上分配、标量替换优化技术使得对象都在对上分配变得不那么绝对
  • 意义:Java堆是Java虚拟机所管理的内存中最大的一块,被所有线程共享,在JVM启动时创建。Java堆是垃圾收集器管理的主要区域,Java堆可以细分为:新生代(Young Generation)、老年代(Old Generation)、永久代(Permanent Generation);新生代再细致一点可以分为Eden空间、From Survivor空间、To Survivor空间。如果配置-XX:+/-UseTLAB,每个线程在Java堆中预先分配一小块内存,称为本地线程分配缓冲(Thread Local Allocation Buffer, TLAB)
  • 存储内容: 存放对象实例及数组(创建数组时,创建动作由字节码指令newarray触发,虚拟机自动生成一个为java.lang.Object的子类的类,这个类中实现了数组中应有的属性和方法,可以直接访问的为public类型的length属性和clone()方法),几乎所有的对象实例都在这里进行分配。堆可以处于物理上不连续的内存空间,只要逻辑上是连续的就可以
  • 可能发生的异常:如果堆中没有内存完成实例分配,并且堆也无法再拓展(堆可以是固定大小的,拓展可通过-Xms和-Xmx参数控制)时,将会抛出OutOfMemoryError异常
  1. 方法区
  • 作用:用于存储运行时常量池、已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据
  • 意义:对运行时常量池、常量、静态变量等数据做出了规定
  • 存储内容:运行时常量池(具有动态性)、已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据
  • 可能发生的异常:当方法区无法满足内存分配需求的时候抛出OutOfMemoryError异常

运行时常量池

运行时常量池是方法区的一部分。Class文件中出了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池,用于存放编译期间生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池存放

jdk6、jdk7、jdk8对于方法区的设计不同

  • 运行时常量池在JDK1.6及之前版本的JVM中是方法区的一部分,而在HotSpot虚拟机中方法区放在了”永久代”。所以运行时常量池也是在永久代的
  • 但是JDK1.7及之后版本的JVM已经将运行时常量池从方法区中移了出来,在Java 堆(Heap)中开辟了一块区域存放运行时常量池
  • 而在JDK1.8中,已经彻底没有了永久代,将方法区直接放在一个与堆不相连的本地内存区域,这个区域被叫做元空间

© 著作权归作者所有

共有 人打赏支持
hensemlee
粉丝 6
博文 51
码字总数 38646
作品 0
徐汇
程序员
JVM 运行时数据区简介及堆与栈的区别

理解JVM运行时的数据区是Java编程中的进阶部分。我们在开发中都遇到过一个很头疼的问题就是OutOfMemoryError(内存溢出错误),但是如果我们了解JVM的内部实现和其运行时的数据区的工作机制,...

大数据之路
2015/08/02
0
1
001. 深入JVM学习—Java运行流程

Java运行流程图 2. Java运行时数据区 3. Java虚拟机栈 栈内存是线程私有的,其生命周期和线程相同; 虚拟机栈描述的是Java方法执行的内存模型:执行一个方法时会产生一个栈帧随后将其保存到栈...

影狼
06/22
0
0
面试中关于Java虚拟机(jvm)的问题看这篇就够了

最近看书的过程中整理了一些面试题,面试题以及答案都在我的文章中有所提到,希望你能在以问题为导向的过程中掌握虚拟机的核心知识。面试毕竟是面试,核心知识我们还是要掌握的,加油~~~ 下面...

snailclimb
05/12
0
0
Java虚拟机运行时数据区结构

本文部分参考自《Java虚拟机规范(Java SE 7版)》的中译本和周志明的《深入理解Java虚拟机》,另加个人理解。原书对Java虚拟机运行时数据区描述只有6页,同时参考其他网络网资料,个人能力所...

foodon
2014/12/09
0
4
深入理解Java虚拟机的体系结构

JAVA虚拟机的生命周期 一个运行时的Java虚拟机实例的天职是:负责运行一个java程序。当启动一个Java程序时,一个虚拟机实例也就诞生了。当该程序关闭退出,这个虚拟机实例也就随之消亡。如果...

java进阶
06/22
0
0
《深入理解Java虚拟机》之Java虚拟机内存结构(1)

这个是很重要的一个基础认识。 java虚拟机规范规定的java虚拟机内存其实就是java虚拟机运行时数据区,其架构如下: 其中方法区和堆是由所有线程共享的数据区。 Java虚拟机栈,本地方法栈和程...

lixiyuan
2014/04/10
0
1
JVM参数调优:Eclipse启动实践

JVM参数调优:Eclipse启动实践 本文主要参考自《深入理解 Java 虚拟机》。 这本书是国人写的难得的不是照搬代码注释的且不是废话连篇的技术书,内容涵盖了 Java 从源码到字节码到执行的整个过...

天天顺利
2015/01/13
0
0
JVM系列-Java内存区域(一)

运行时数据区域 Java虚拟机在Java程序执行过程中会把它所管理的内存划分为若干个数据区域,有的区域随着虚拟机进程的启动而存在,有的区域依赖用户线程的启动和结束而建立和销毁。 RUNTIME ...

stefanzhlg
2014/08/29
0
0
JVM 之 运行时数据区(更新)

第一篇 JVM 之 Class文件结构 JVM定义了一系列程序运行期间使用的运行时数据区(run-time data area)。这些数据区域中的一些随着JVM的启动而创建直到JVM的停止而销毁,而另一些则随着某个线...

麦壳原野
2014/12/19
0
9
java 虚拟机--新生代与老年代GC

1. Java堆中各代分布: 图1:Java堆中各代分布 Young:主要是用来存放新生的对象。 Old:主要存放应用程序中生命周期长的内存对象。 Permanent:是指内存的永久保存区域,主要存放Class和M...

SunnyWu
2014/10/16
0
4

没有更多内容

加载失败,请刷新页面

加载更多

下一页

设计模式:单例模式

单例模式的定义是确保某个类在任何情况下都只有一个实例,并且需要提供一个全局的访问点供调用者访问该实例的一种模式。 实现以上模式基于以下必须遵守的两点: 1.构造方法私有化 2.提供一个...

人觉非常君
6分钟前
0
0
《Linux Perf Master》Edition 0.4 发布

在线阅读:https://riboseyim.gitbook.io/perf 在线阅读:https://www.gitbook.com/book/riboseyim/linux-perf-master/details 百度网盘【pdf、mobi、ePub】:https://pan.baidu.com/s/1C20T......

RiboseYim
16分钟前
0
0
conda 换源

https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/conda config --add channels https://mir......

阿豪boy
26分钟前
0
0
Confluence 6 安装补丁类文件

Atlassian 支持或者 Atlassian 缺陷修复小组可能针对有一些关键问题会提供补丁来解决这些问题,但是这些问题还没有放到下一个更新版本中。这些问题将会使用 Class 类文件同时在官方 Jira bug...

honeymose
36分钟前
0
0
非常实用的IDEA插件之总结

1、Alibaba Java Coding Guidelines 经过247天的持续研发,阿里巴巴于10月14日在杭州云栖大会上,正式发布众所期待的《阿里巴巴Java开发规约》扫描插件!该插件由阿里巴巴P3C项目组研发。P3C...

Gibbons
44分钟前
0
0
Tomcat介绍,安装jdk,安装tomcat,配置Tomcat监听80端口

Tomcat介绍 Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。 java程序写的网站用tomcat+jdk来运行...

TaoXu
45分钟前
0
0
TensorFlow,从一个 Android Demo 开始

TensorFlow Android Demo 项目地址 Machine Learning 既然提到了 TensorFlow,那是不是得神经网络、机器学习了解下? 如果你能坚持把 机器学习速成课程 给啃完了,觉得还挺有兴趣的,那可以考...

孟飞阳
46分钟前
0
0
JVM学习笔记二:内存结构规范

1、JVM基本结构图 2、java堆(Heap) 3、方法区(Method Area) 4、程序计数器 5、JAVA栈图解 局部变量表:八大基本类型,还可以存储引用类型 上一篇:JVM学习笔记一:类加载机制介绍...

刘祖鹏
52分钟前
0
0
mui集成微信H5支付(返回白屏问题已经解决)

一.项目需求 因为公司人员缺少,没有专门开发安卓和ios的人员,为了项目尽早上线采用了混合APP开发的方式,我选择了MUI混合开发框架,项目中需要在用户购买VIP会员的时候进行支付,所以需要在项目...

银装素裹
56分钟前
1
0
SpringBoot集成Redis--配置自定义的RedisCacheManager

配置自定义的RedisCacheManager--1自定义键生成规则 默认的键生成器 当不指定缓存的key时,SpringBoot会使用SimpleKeyGenerator生成key。 SimpleKeyGenerator SimpleKey 查看源码可以发现,它...

karma123
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部