深入理解JVM笔记-Java的内存区域

Java内存区域

Java内存划分为5个部分,分别是程序计数器、虚拟机栈、本地方法栈、方法区、堆,其中程序计数器、虚拟机栈、本地方法栈都是线程私有的内存,而方法区和堆是线程共享的内存区域。

程序计数器中存放当前线程下一条要执行的字节码指令。虚拟机栈中存储的基本数据结构称为栈帧,每个方法被执行的时候,Java虚拟机都会创建一个栈帧用来存储局部变量表(保存函数参数、局部变量等)、操作数栈(用于存储临时变量的区域)、方法出口等信息。本地方法栈与虚拟机栈功能相同,但是用来存储本地方法的区域。方法区中存放了类的元信息、静态变量、常量等。Java堆用于存放应用程序中的所有对象,几乎所有的对象和数组都存放在堆上。

对象的创建过程

对象的创建过程:
首先定位全类名、检查类是否加载、如果加载就为对象分配内存,否则先加载类的class文件,再创建对象。

对象内存分配方式

对象内存分配的方式有2种,分别为指针碰撞、空闲列表。
指针碰撞:用一个指针将堆内存分为空闲区和非空闲区,好处是简单、高效,并且只用维持一个指针。
空闲列表:当内存中空闲区和非空闲区相互交错,就无法采用指针碰撞的方法,所有可以采用一个空闲列表记录所有的空闲区域。
采用哪种内存分配方式要根据Java堆是否规整来确定(采用标记-整理算法的GC可以采用指针碰撞的方式,采用标记-清除算法的GC采用空闲列表的方式)。

对象的内存布局

对象在堆中分为3个部分:对象头,实例数据、填充
对象头:类型指针(指向方法区中的class类对象)和运行时数据(包括hashcode值、GC年龄、锁状态等)
填充数据:对象存储的有效信息
填充:HotSpot JVM下的所有对象的大小都是8字节的倍数

对象的访问定位

对象访问方式包括2种:使用句柄访问、直接访问
使用句柄访问:堆中划出一块句柄池来存储句柄,句柄包含对象实例数据和类型数据的指针。优点是对象进行移动时,只用改变句柄中实例对象的指针,缺点是访问实例数据需要2次访问。
直接访问:缺点是对象移动时,需要改变对象引用的值,但是访问实例数据很只要一次访问(HotSpot采用这个方式)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值