Java对象在Java虚拟机的创建过程

来源:互联网 发布:python tcp 保持连接 编辑:程序博客网 时间:2024/06/02 23:35

创建

1、相应类加载检查过程

Java程序中的“new”操作会转换为Class文件中方法的“new”字节码指令。
JVM(本文特指HotSpot)遇到new指令时,先检查指令参数是否能在常量池中定位到一个类的符号引用:
A)、如果能定位到,检查这个符号引用代表的类是否已被加载、解析和初始化过;
B)、如果不能定位到,或没有检查到,就先执行相应的类加载过程;

2.分配内存

分配内存有两种方法。内存大小在类加载时候已被确定。
a)指针碰撞:内存分配事规整的,在内存中,一边是分配过的,一边是没有分配过的,中间是区分它们的指针,只需要这个指针向空闲空间那边移动一段和对象大小相等的距离即可
b)空闲列表:内存分配是不规整的,空闲片段和已分配片段交织一起,这是后,虚拟机需要维护一张空闲列表,每次对内存的操作就是对表的修改操作。

3.线程安全问题

对象分配内存在虚拟机是很常见的操作,所以在并发的情况下有可能出现 “线程A给某个对象分配内存移动指针,还没来的及移动指针,线程B就使用了该指针” 的问题。处理方法也是有两种。
a)同步处理:CAS加失败重试的方式,这样会影响到性能。
b)直接为每个线程分配一段固定大小的缓存。

4.初始化

分配完内存之后,虚拟机会把分配到的内存空间都会初始化为零值,保证了实例字段不被初始化就能使用,只是实例字段都是零值。

5.执行对象实例方法

对象执行了方法,按照程序员的想法初始化之后,一个真正可用的对象就产生了。
通常,经过上面5步对象才完全new出来。

原创粉丝点击