Java虚拟机对象的创建-《深入理解Java虚拟机》读书笔记

来源:互联网 发布:struts返回json数据 编辑:程序博客网 时间:2024/05/14 22:44

Java虚拟机对象的创建(Hotspot)

在讨论之前:要先注意两点:

  • 讨论虚拟机时,由于各个虚拟机实现不同,这里以Hotspot为例介绍。
  • 对象不包括数组和Class对象

对象的创建都是通过new关键字来创建,虚拟机遇到new关键字时会经过如下过程:

Created with Raphaël 2.1.0开始定位是否曾经加载过?新生对象分配内存内存空间初始化零值对象设置执行java程序的init方法结束加载,解析,初始化yesno

这里说明一下上述的过程:

  • 定位:主要是定位类的符号引用的位置,在定位完之后,会判断该类是否被加载过,如果没有,则需要重新加载,解析以及初始化
  • 新生对象分配内存:在类加载完成之后,对象所需要的内存大小就可以完全确定了,此时就可以为内存对象划分内存了。划分内存的方式有两种,一种是指针碰撞,另外一种是空闲列表;具体使用哪种方式来划分内存,根据各个虚拟机的实现不一样,两种的区别如下:

    • 指针碰撞:当java堆中的内存是整齐的,使用过的内存和未使用过的内存明显划分开来,当需要分配内存时,通过对象所需要的内存大小移动指针位置就可以为对象分配内存了。
    • 空闲列表:当java堆中的内存不是整齐的,空闲内存与使用过的内存交叉在一起的时候,通过维护一个列表,在列表中找到足够大的内存块来进行分配,同时更新这个列表。
  • 初始化零值:内存分配完之后,将分配的内存空间都初始化为零值

  • 对象设置:主要设置这个对象是哪个类的实例,类的元信息,对象的哈希吗等。当这一步工作完成之后,从虚拟机的角度来看,一个新的对象已经完成了。
  • 执行java程序的init方法:在上一步完成之后,虚拟机的工作已经完成,之后就是调用对象的构造器等来初始化这个java对象的一些基本信息。到这一步一个对象已经完成了创建过程
0 0
原创粉丝点击