创建过程:
接收new指令后,
1. 检查引用代表的类是否被加载、解析、初始化过,若没有,则执行类加载机制(类加载机制可确定内存大小);
2. 分配内存
两种分配方式
指针碰撞(Bump the Pointer)
-- 指针碰撞是指:在java堆内存规整(即采用带有压缩整理功能算法的垃圾回收器,如:Serial、ParNew等带Compact过程的收集器)情况下,
给对象分配内存就是向空闲内存空间处移动指针,移动距离与对象大小相等;
空闲列表(Free List)
-- 空闲列表是指:在java堆内存不规整(即采用不带压缩整理功能算法的垃圾回收器,如:CMS等基于Mark-Sweep算法的收集器)情况下,
需要有个表记录那块是空着的,大小多少,这样才能在给对象分配内存的时候找到足够大小的空间分配内存;
线程安全问题:
由于java程序运行时,创建对象的操作非常频繁
JVM为避免线程冲突操作,有两种方式:
一、分配内存操作同步处理;
二、每个线程在java堆中预先分配一小块内存,这一小块内存称为本地线程分配缓冲(Thread Local Allocation Buffer, TLAB),哪个线程需要创建对象分配内存就在对应的TLAB上分配,当TLAB用完时分配新的TLAB,才会同步锁定;
JVM是否使用TLAB,可以通过-XX:+/-UseTLAB参数来设定;
3. 设置这个对象是哪个类的实例、如何才能找到类的元数据信息、对象的哈希吗、对象的GC分代年龄等信息。这些信息存放在对象的对象头中。
原文:https://www.cnblogs.com/zhushaolong/p/11361028.html