6. 说说Java对象创建过程

1.JVM遇到一条新建对象的指令时首先去检查这个指令的参数是否能在常量池中定义到一个类的符号引用。然后加载这个类(类加载过程在后边讲)

2.为对象分配内存。一种办法“指针碰撞”、一种办法“空闲列表”,最终常用的办法“本地线程缓冲分配(TLAB)”

  • 指针碰撞:要求内存空间必须是规则且连续的,指针会指向已分配内存的末端。
  • 空闲列表:内存中对象的分布不连续时,JVM就会使用空闲列表来分配对象,JVM从空闲列表中检索可用的区域来分配内存。
  • JVM解决内存分配的并发安全问题的方式也有两种:
    CAS:先读取当前内存地址A的值,经过JVM的预处理,然后将上次读取的值与现在内存地址A的值做比较,如果两次读到的值相同,则分配成功。
    TLAB:使用CAS的方式已经相对较快,但是依旧需要进行一次Compare And Swap,还是有性能损耗。所以JVM有一个TLAB机制(Thread Local Allocation Buffer),这是一块存在于Eden区中的线程独享的内存区域,由于是线程独享的,所以并不存在并发问题,也就是快。但TLAB的默认值是Eden的1%,如果对象比较大,还是通过CAS方式在堆中分配(不一定会分配在Eden中,大对象会直接分配到老年代)。

3.将除对象头外的对象内存空间初始化为0

4.对对象头进行必要设置

posted on 2025-01-08 20:44  南柯易梦  阅读(39)  评论(0)    收藏  举报