深入理解JAVA虚拟机学习|第一篇:Java内存区域

1.说明

此系列文章为学习《深入理解JAVA虚拟机》笔记,平时也有了解JAVA虚拟机,但始终感觉学习得不够系统深入,正好趁现在工作不算太忙,所以打算静下心来好好研读一些此书。

2.Java内存区域及说明

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kuvPUXrE-1570933481968)(C:\Users\zycao\AppData\Roaming\Typora\typora-user-images\1570717171714.png)]

区域用途说明
程序计数器线程执行时的行号指示器1.记录下一次要执行的字节码指令地址
2.唯一一个不存在内存溢出区域
3.线程私有
4.执行Native方法时,计数器值为空(undefined)
虚拟机栈存放对象引用,局部变量表,方法出口等信息1.线程私有
2.存入StackOverflowErrorOutOfmemoryError异常
本地方法栈虚拟机执行native方法用到的区域1.线程私有
2.存入StackOverflowErrorOutOfmemoryError异常
主要用于创建实例对象区域,垃圾回收主要区域1.线程共有
2.会抛出OutOfmemoryError
方法区存放类信息、常量、静态变量、即时编译后的代码1.包含运行时常量池
2.线程共有
3.会抛出OutOfmemoryError
直接内存直接操作native函数库的内存,其引用存放在jav堆中的DirectByteBuffer对象中1.会抛出OutOfmemoryError

3.对象的内存布局

在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头(Header)、实例数据(Instance Data)和对象填充(Padding),这三部份保存的信息如下所示

区域信息
对象头1.用于保存对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、锁状态标志等
2.官方称为Mark Word
3.在32位空间中的25bit保存哈希码、4bit保存分代年龄、2bit用于保存标志位、1bit固定为0
4.保存类型指针,即保存该对象是属于那一个实例所有的指针,如果保存数组时,还会保存数组长度
实例数据保存对象的属性中储存的内容,保存顺序受虚拟机分配策略和对象中定义属性顺序有关,通常将属性相同的类型保存在一起
对齐填充非必须,仅占位符作用

4.对象访问方式

  • 句柄

在堆内存中维护一个句柄池,虚拟机栈中保存句柄池地址,句柄池中保存对象实例数据指针对象类型数据指针,

​ 优点:存储的是句柄地址,对象移动时改变实例数据指针,栈中reference维护地址不用修改

​ 缺点:查找对象需要二次定位,增加了指针定位的时间开销

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VBkrng7L-1570933481970)(C:\Users\zycao\AppData\Roaming\Typora\typora-user-images\1570933431572.png)]

  • 直接指针

栈中引用reference直接保存对象地址,而堆中必须自己维护对象类型数据指针引用

优点:速度快,不需要指针二次定位,减少指针定位的时间开销

缺点:需要堆中维护对象类型指针

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值