一个对象的自白
Posted on 2013-11-21 13:01:05 JVM Views: 1262

对象创建的方式有哪些

Java对象创建的5种常见方式如下

  1. 通过关键字new调用构造器创建Java对象
String str = new String("hello");
  1. 通过Class对象的newInstance()方法调用构造器创建Java对象
Class.forName("com.mysql.jdbc.Driver").newInstance();   
  1. 通过Java的反序列化机制从IO流中恢复Java对象
FileInputStream fis = new FileInputStream("object.dat");
ObjectInputStream ois = new ObjectInputStream(fis);
Person person = (Person) ois.readObject();
  1. 通过Java对象提供的clone()方法复制一个新的Java对象
public class Base implements Cloneable{
    int i = 20;
    @Override
    protected Object clone() throws CloneNotSupportedException {
         return super.clone();
    }
}
public class CloneTest {
    public static void main(String[] args) throws Exception {
        Base b = new Base();
        Base c = (Base) b.clone();
    }
}
  1. 对于字符串以及基本类型的包装类(Byte,Short,Integer,Long,Character,Float和Double),Java允许他们以直接量来创建Java对象
Integer in = 5;

那么NEW一个对象的创建过程如何

类加载过程检查(待补充)

JVM遇到一条new指令时,先检查类加载过程

  • 常量池中是否定位到一个类的符号引用
  • 此符号引用代表的类是否已经被加载、解析和初始化
新生对象分配内存
对象内存大小如何确定?

对象所需内存大小在类加载完成后便可以确定

内存的分配方式如何定?

由Java堆是否规整决定,Java堆是否规整由垃圾收集器是否带有压缩整理功能。类存分配方式:

  • 指针碰撞(Bump the Pointer):Java堆中内存是绝对规整的情况下,所有用过的内存放在一边,空闲的内存放在另一边,中间放着一个指针作为分界点的指示器,分配内存只需要移动指针即可。
  • 空闲列表(Free List):Java堆中的内存是不规整的情况下,已使用的内存和空闲内存相互交错,JVM维护一个列表,记录内存具体情况
并发情况下,内存分配的线程安全问题?
  • 同步处理:对内存分配动作进行同步处理
  • 本地线程分配缓冲:内存分配动作按照线程划分在不同的空间之中进行,每个线程在Java堆中预先分配一小块内存
对象头设置
对象头存放哪些信息?

存储对象自身的运行时数据部分

  • 对象是哪个类的实例
  • 如何才能找到类的元数据信息?
  • 对象的哈希吗是多少?
  • 对象的GC分代年龄信息
  • ......

类型指针部分
对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪一个类的实例

执行init方法

上述步骤后,所有的字段都还没有初始化,需要按照程序员的意愿设定初始化,才算完成一个对象的完全产生。

Reference