JVM小知识

本文详细探讨了Java对象在内存中的分配和布局。Class对象存放在堆中,而非方法区,而类的元数据则位于方法区。对象的分配根据大小和逃逸分析可能发生在栈、新生代或老年代。对象定位采用直接指针或句柄方式,影响访问速度。此外,介绍了对象大小必须为8字节的整数倍,以及普通对象和数组在内存中的布局特点。
摘要由CSDN通过智能技术生成

目录

Class对象在方法区还是在堆

补充概念

正文

对象是怎么分配的

对象的定位方式

 对象在内存中的布局

Class对象在方法区还是在堆

补充概念

永久代和元空间是方法区的具体实现

正文

Class对象是存放在堆区的,不是方法区,这点很多人容易犯错。类的元数据(元数据并不是类的Class对象Class对象是加载的最终产品,类的方法代码,变量名,方法名,访问权限,返回值等等都是在方法区的)才是存在方法区的。

实例对象在堆

实例对象的引用在栈

实例对象通过方法区和堆中的Class对象对应

Class对象在堆里,方便我们拿出来做反射

对象是怎么分配的

  1. new对象时,如果开启逃逸分析,不存在逃逸并且对象不大的时候,优先分配到栈。优势是不需要垃圾回收。
  2. 大对象放入老年代
  3. 不大不小时放入线程本地缓冲区(TLAB位于新生代,用来协调分配空间),最终落入新生代。

对象的定位方式

句柄方式和直接指针。hotspot默认使用直接指针。

句柄方式:在对象被移动时只会改变句柄中的实例数据指针,而 reference 本身不需要修改。

直接指针:使用直接指针访问方式最大的好处就是速度快,它节省了一次指针定位的时间开销。

 对象在内存中的布局

普通对象

补充:new Object();大小为16字节。markword的8字节,类型指针4字节,对齐补充4字节。

对象的大小必须是 8 字节的整数倍

 数组

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值