系列文章目录
推荐阅读书籍:深入理解Java虚拟机 周志明 第2版/第3版
Java学习笔记1—JVM虚拟机—1.1运行时数据区_摸金青年v的博客-CSDN博客
Java学习笔记1—JVM虚拟机—1.2垃圾回收机制_摸金青年v的博客-CSDN博客
目录
前言
研究虚拟机运行时数据区的目的,了解虚拟机的内存划分,哪些对象对应分配到所属的区域,哪些是线程隔离的,对象如果分配内存,分配多少,整体的内存分区如下图。
一、运行时数据区有哪些?
1. 程序计数器
用途:作为当前线程所执行字节码的行号指示器,通过改变计数器的值来选取下一条指令
特点:线程隔离(线程私有)、每个线程有独立计数器、唯一没有规定抛出out-ofMemoryError的区域
如何理解:java多线程时通过线程轮流切换的方式实现
为保证多线程切换后能恢复正确的执行位置,因此设计
每条线程都需要一个独立的程序计数器,各条线程之间的计数器不能互相影响,即线程私有
2. 虚拟机栈
用途:java方法执行的同时会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口。每个方法从调用开始到执行完成对应一个栈帧在虚拟机栈入栈到出栈的过程。
特点:线程隔离、抛出两种异常
局部变量表:存放了编译期可知的基本数据类型、对象引用;局部变量表所需的内存空间在编译时已完成分配,方法运行期间不会改变局部变量表大小。
两种内存异常:
如果线程请求的栈深度大于虚拟机所允许的深度,会抛出Stack-overflowError
如果虚拟机可以动态扩展,如果扩展时无法申请到足够的内存,抛出out-ofMemoryError
3. 本地方法栈
用途:和虚拟机方法栈相似
特点:线程隔离、抛出两种异常、与虚拟机方法栈不同于服务对象
虚拟机栈服务于:java方法(字节码)
本地方法栈服务于:虚拟机使用到的Native方法服务
4. 堆内存
用途:唯一目的存放对象实例,和数组。随着JVM版本更新,所有对象实例都在堆分配不是那么绝对了
特点:线程共享,虚拟机启动时创建,是垃圾收集器的主要区域(Gc堆)可以分代划分描述堆区
划分的目的是可以更好的回收内存,更快的分配内存;物理上不连续,逻辑上连续;无法满足内存分配时会抛出out-ofMemoryError
5. 方法区
用途:存储已被虚拟机加载的类信息、常量、静态变量、编译后的代码等数据
内存回收主要针对常量池的回收和对类型的卸载
特点:线程共享,物理上不连续,逻辑上连续;不要和永久代混淆;无法满足内存分配时会抛出out-ofMemoryError
运行时常量池:是方法区的一部分,用于存放编译期生成的字面量和符号引用,类加载后存放
特点:运行期间可以将新的常量放入池中,当常量池无法申请到内存时抛出out-ofMemoryError
总结
以上就是今天要讲的内容,运行时数据区的特点和需要关注的要点