内存管理 和TLAB请阅 https://blog.csdn.net/weixin_41842550/article/details/103325281
对象创建过程:new ---> 检查符号引用和类是否被加载--->分配内存--->对象设置信息--->init--->对象产生。
1. 常量池:用于存储编译器生成的各种字面量和符号引用。这部分内容在类加载后进入常量池。
2.虚拟机遇到new指令时,首先检查指令的参数是否能在常量池中定位到一个类的的符号引用。并且检查该符号引用代表的类是否被加载。
如果没加载,则执行类加载过程。
如果已经加载,则为该对象分配内存。对象所需内存在类加载后便可以完全确认。
3.分配方式:依赖于java堆是否规整。是否规整依赖于垃圾收集器。(垃圾收集器是否有压缩整理功能)
指针碰撞:java堆规整,空闲内存放一边,已用的放一边。指针作为分界点的指示器。
空闲列表:java堆不规整,空闲,已用内存相互交错。需要维护一张列表记录内存的情况。
4.创建对象频繁,并发情况下分配内存不安全。需要采取同步机制。
对分配动作进行同步。
使用用TLAB时,线程程分配TLAB时同步。
5.对对象设置信息,对象头信息:属于哪个类的实例,hash值,GC分代年龄等。
6.信息设置完,执行<init>,初始化对象。对象产生。
《深入理解java虚拟机》 (第二版) 学习之路