对象创建

创建过程:

接收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分代年龄等信息。这些信息存放在对象的对象头中。

猜你喜欢

转载自www.cnblogs.com/zhushaolong/p/11361028.html