JVM创建对象

来源:互联网 发布:修改路由器lan口mac 编辑:程序博客网 时间:2024/06/04 01:10

jvm创建对象机制

JAVA是一门面向对象的语言,我们在创建对象的时候,可能就只是知道有new 这么一个关键字,随后就为我们创建好实例了。但是作为一名程序员,我们应当知道JVM在背后是怎么为我们做到的。

图解

Created with Raphaël 2.1.0JVM加载分配内存初始化?Endyes

JVM加载对象

装载

如果要使用一个对象,那么必须对这个对象进行装载,连接(验证,准备,解析),完成初始化。而装载就是把class文件的字节码转换为方法区中一定的数据结构(数据结构可以存放字段信息,类型信息。方法信息,静态变量,常量池等)并且生成一个class对象的指针(java.lang.Class)。

验证

虽然在装载后class文件被转换到了方法区中的数据结构,但是JVM还需要对它进行验证,为了保证不会对虚拟机有害。

准备

当验证通过后,便开始准备为静态变量分配内存地址,并且赋予初始值。例如一个static a = 100,首先会为a赋值为0,随后会在初始化阶段为a赋值为我们需要的值。

解析

在这个阶段,JVM还会为方法的符号引用转换为直接引用,这或者说是静态解析阶段。

初始化

真正意义的执行JAVA代码,会为静态变量从准备阶段到初始化阶段,在初始化中。有一些规范:
1.子类在继承父类的时,必须为父类进行初始化。
2.在Class.newIntance(” “)时,必须进行初始化,详情请查询api。
3.在get static 和 put staic 读取或者设置一个静态变量的值(常量池除外),或者调用一个静态方法,都需要对对应的类进行初始化。
4.在JVM启动时,会指定一个mian()主类,会优先初始化这个类。
5.对于JDK1.7后的动态语言,某一点,具体还不了解,随后补充。

分配内存

初始化完成后,自然要从JVM的Heap中为它分配内存,所需内存大小就已经确定下来,至于实在新生代还是老年代中产生,具体请查看资料。
假如堆的结构是相对规整:那么所有用过的内存都会放在一边。空闲的内存放在另一边,中间则有一个指针作为分界点的指示器,那么分配内存就是把指针往空闲内存中移动一段与对象相同大小的距离,这就是所谓的“指针碰撞”;
假如堆的结构是不规则的:那么使用的内存和未使用的内存则是相互交错的,则JVM就需要维护整个列表。记录那些内存时刻用的,在分配时候往可用的找到一块足够大的内存给实例。并且更新已使用内存的记录。这种分配方式就是“空闲列表”;
那种分配方式取决于堆的结构,而堆是否规则又是由GC是否带有压缩整理功能决定。

完成初始化零值

分配内存完成后,JVM会对分配到的内存空间都初始化零值(不包括对象头),以保证在访问·JAVA实例的代码中不赋予初始值就可以直接使用,程序可以访问到所对应数据类型的零值。

1 0