对象的创建

 1  对类加载进行检查,之后分配内存大小(大小是在类加载的时候就确认的了)具体的分配内存的方式有两种(原因是由于不同的垃圾回收策略造成的)

     1)由于使用Serial,ParNew ,带有Compact过程的收集器时对内存的处理是规整的,所以对内存分配可以使用”指针碰撞“的方式

      2)使用cms这种基于mark-sweep  这种算法的收集器的时候对内存的处理是不规整的,所以内存的分配的方式是空闲列表

 

2 创建对象的时候要保证数据的原子性,频繁的创建对象操作在修改指针的位置的时候也并不是线程安全的。解决这种问题有两种常见的方式:

   1) 对分配内存空间的操作进行同步的处理,

  2) 把内存分配动作按照线程划分在不同的空间之中进行,为每个线程在java堆中预先分配一小块内存,成为本地线程分配缓存(Thread Local Allocation Buffer TLAB) 哪个线程要分配内存就在哪个线程的TLAB上分配,只有TLAB分配完了之后才需要同步的锁定,虚拟机是否使用TLAB  可以通过-XX:+/UseTLAB参数来设定

 

3 虚拟机要对对象进行设置,比如这个对象属于哪个实例,如果才能找到类的元数据信息,对象的哈希吗,对象的gc分代年龄,

 

4 上面操作只是在虚拟机的层面上一个对象创建成功了,但从java程序的视角来看,对象创建才刚刚开始,执行init方法后一个真正的对象才算创建完成。

posted @ 2017-05-01 18:01  杰骜不驯  阅读(141)  评论(0编辑  收藏  举报