Java对象的创建:
在创建对象时通常只是一个new关键字,但是Java虚拟机首先会检查参数是否能在常量池中定位到一个类的符号引用,并检查这个类是否已经被加载,解析和初始化过,如果没有,那么必须先执行类的加载。
类的加载、连接、初始化三个步骤:
1.类的加载将类的Class文件读入内存中,并为之创建一个java.lang.Class对象。
2.类的连接:
连接阶段负责将类的二进制数据合并到JRE中。
3.类的初始化
类的初始化时机:
(1)创建类的实例:new操作符、反射创建实例、通过反序列化;
(2)调用某个类的静态方法;
(3)访问某个类的静态属性(final属性除外)。
1.类的加载将类的Class文件读入内存中,并为之创建一个java.lang.Class对象。
2.类的连接:
连接阶段负责将类的二进制数据合并到JRE中。
3.类的初始化
类的初始化时机:
(1)创建类的实例:new操作符、反射创建实例、通过反序列化;
(2)调用某个类的静态方法;
(3)访问某个类的静态属性(final属性除外)。
在类加载过后,接下来将会为对象分配内存,分配内存一般有两种方法:一种是“指针碰撞”,当Java堆是绝对规整的,就是所有可用的内存放在一边,所有已用的内存放在一边,中间又一个指针来分隔,那么分配内存时便会将指针移动这个对象的大小个距离,如Seria、ParNew等带Compact过程的收集器时随时用指针碰撞;另一种是“空闲列表”,当Java堆不是规整的时,就是可用得内存和已用的混在一起,这时,虚拟机就得维护一个列表,,记录哪些是可用的,分配时找到可用的分配给对象,如CMS。
由于创建对象是相对频繁的,所以要考虑线程安全问题这里有两种方法:(1)对分配内存的空间做同步处理(2)把内存分配的动作按照线程划分在不同的空间进行。
这还没完,接下来,虚拟机要对对象进行必要的设置,如确定它是哪个类的实例,如何找到类的元数据,对象的哈希码等,这些信息存放在对象头中。