您的位置:首页 > 编程语言 > Java开发

Java虚拟机相关知识(2)—对象的创建

2016-04-01 19:15 295 查看

对象的创建

当要new一个对象时,主要执行的步骤有以下几条;

定位new后面的参数在常量池定位中是否能够找到该类的符号引用。若找不到,就进行相应的类加载过程。
对要new的对象在堆中分配一定的空间。
在类加载过程中,对象的大小已经确定。

指针碰撞:假设堆中空间是连续的,未分配和已分配的中间用一个指针分隔表示。则将指针向未分配部分移动,则可为其划分空间空闲列表:堆中空间不是连续的,则维护一个空闲列表,记录哪些内存块可用。分配时找一个比较大的空间分配,然后更新列表。

采用哪种方式,主要看垃圾收集器是否实现了压缩功能。

为对象在堆中分配空间的方法主要有两种,指针碰撞和空闲列表法。

考虑对象在虚拟机中是否安全
有可能造成线程不安全。一种是采用CAS+失败重试方法保证更新的原子性,另一种是将堆分成不同的空间上,每个线程在堆上预先分配一小块内存,称为本地线程缓冲(TLAB)。是否开启TLAB由-XX:+/-UseTLAB设定
将分配到的内存空间初始化为零值
保证类中变量可以不赋初值直接使用
对对象进行必要的设置,存放在对象的对象头
如这个对象是哪个类的实例、如何才能找到类的元数据信息、对象的哈希码、对象的GC分代信息等。
执行<init>方法,如构造方法和代码块。
将对象初始化
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: