对象的创建
Posted 杰骜不驯
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对象的创建相关的知识,希望对你有一定的参考价值。
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方法后一个真正的对象才算创建完成。
以上是关于对象的创建的主要内容,如果未能解决你的问题,请参考以下文章
设计模式代理模式 ( 动态代理使用流程 | 创建目标对象 | 创建被代理对象 | 创建调用处理程序 | 动态创建代理对象 | 动态代理调用 )