目录
Class对象在方法区还是在堆
补充概念
永久代和元空间是方法区的具体实现
正文
Class对象是存放在堆区的,不是方法区,这点很多人容易犯错。类的元数据(元数据并不是类的Class对象。Class对象是加载的最终产品,类的方法代码,变量名,方法名,访问权限,返回值等等都是在方法区的)才是存在方法区的。
实例对象在堆
实例对象的引用在栈
实例对象通过方法区和堆中的Class对象对应
Class对象在堆里,方便我们拿出来做反射。
对象是怎么分配的
- new对象时,如果开启逃逸分析,不存在逃逸并且对象不大的时候,优先分配到栈。优势是不需要垃圾回收。
- 大对象放入老年代
- 不大不小时放入线程本地缓冲区(TLAB位于新生代,用来协调分配空间),最终落入新生代。
对象的定位方式
句柄方式和直接指针。hotspot默认使用直接指针。
句柄方式:在对象被移动时只会改变句柄中的实例数据指针,而 reference 本身不需要修改。
直接指针:使用直接指针访问方式最大的好处就是速度快,它节省了一次指针定位的时间开销。
对象在内存中的布局
普通对象
补充:new Object();大小为16字节。markword的8字节,类型指针4字节,对齐补充4字节。
对象的大小必须是 8 字节的整数倍
数组