对象创建
一个java程序无时无刻都在创建对象,可能在java程序中只需要一个new关键字,但是在jvm中又是怎样的流程呢?我们根据下图来看一下:
(1)使用new命令,创建对象,jvm到常量池中查找这个类的符号引用。
(2)检查这个类符号引用的类是否被加载,是否被解析,是否完成初始化。
(3)如果没有,则需先加载类,通过加载器加载后面再仔细研究。如果有,跳过这一步
(4)对类的实例在java堆内存中分配内存。
(5)虚拟机要对对象进行必要的设置,例如这个对象是哪个类的实例、如何才能找到类的元数据信息、对象的哈希码、对象的GC分代年龄等信息。
(6)执行<init>方法。
对象访问
对象访问有两种方式:
(1)访问对象时,访问栈帧中局部变量表的引用类型,这个引用类型指向java堆中的一小块内存——句柄池。句柄池中存放实际的java对象实例的地址。这样好处就是即使对象实例地址发生变化(比如垃圾收集时移动对象),只需要改变句柄池中的地址就可以了。
(2)直接映射,在本地变量表中直接存储实例对象的地址,这样的好处是节省了多一次映射的开销,提高了访问速度。