Java学习笔记1—JVM虚拟机—1.1运行时数据区

系列文章目录

推荐阅读书籍:深入理解Java虚拟机  周志明 第2版/第3版

​​​​​​​Java学习笔记1—JVM虚拟机—1.1运行时数据区_摸金青年v的博客-CSDN博客

Java学习笔记1—JVM虚拟机—1.2垃圾回收机制_摸金青年v的博客-CSDN博客


目录

系列文章目录

前言

一、运行时数据区有哪些?

1. 程序计数器

2. 虚拟机栈

3. 本地方法栈

4. 堆内存

5. 方法区

总结


前言

             研究虚拟机运行时数据区的目的,了解虚拟机的内存划分,哪些对象对应分配到所属的区域,哪些是线程隔离的,对象如果分配内存,分配多少,整体的内存分区如下图。


一、运行时数据区有哪些?

1. 程序计数器

用途:作为当前线程所执行字节码的行号指示器,通过改变计数器的值来选取下一条指令

特点:线程隔离(线程私有)、每个线程有独立计数器、唯一没有规定抛出out-ofMemoryError的区域

如何理解:java多线程时通过线程轮流切换的方式实现

为保证多线程切换后能恢复正确的执行位置,因此设计

每条线程都需要一个独立的程序计数器,各条线程之间的计数器不能互相影响,即线程私有

2. 虚拟机栈

用途:java方法执行的同时会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口。每个方法从调用开始到执行完成对应一个栈帧在虚拟机栈入栈到出栈的过程。

特点:线程隔离、抛出两种异常

局部变量表:存放了编译期可知的基本数据类型、对象引用;局部变量表所需的内存空间在编译时已完成分配,方法运行期间不会改变局部变量表大小。

两种内存异常:

如果线程请求的栈深度大于虚拟机所允许的深度,会抛出Stack-overflowError

如果虚拟机可以动态扩展,如果扩展时无法申请到足够的内存,抛出out-ofMemoryError

3. 本地方法栈

用途:和虚拟机方法栈相似

特点:线程隔离、抛出两种异常、与虚拟机方法栈不同于服务对象

虚拟机栈服务于:java方法(字节码)

本地方法栈服务于:虚拟机使用到的Native方法服务

4. 堆内存

用途:唯一目的存放对象实例,和数组。随着JVM版本更新,所有对象实例都在堆分配不是那么绝对了

特点:线程共享,虚拟机启动时创建,是垃圾收集器的主要区域(Gc堆)可以分代划分描述堆区

划分的目的是可以更好的回收内存,更快的分配内存;物理上不连续,逻辑上连续;无法满足内存分配时会抛出out-ofMemoryError

5. 方法区

用途:存储已被虚拟机加载的类信息、常量、静态变量、编译后的代码等数据

内存回收主要针对常量池的回收和对类型的卸载

特点:线程共享,物理上不连续,逻辑上连续;不要和永久代混淆;无法满足内存分配时会抛出out-ofMemoryError

运行时常量池:是方法区的一部分,用于存放编译期生成的字面量和符号引用,类加载后存放

特点:运行期间可以将新的常量放入池中,当常量池无法申请到内存时抛出out-ofMemoryError


总结

以上就是今天要讲的内容,运行时数据区的特点和需要关注的要点

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值