1、JVM对象创建:java程序运行过程中,无时无刻都有对象被创建出来。在语言层面上就是new关键字。
2、JVM对象创建过程:
(1)JVM遇到一条new指令后,首先会去常量池中,检查这个指令的参数是否有一个类的符号引用,并检查这个符号引用代表的类是否被加载、解析、初始化过。如果没有就执行类加载过程。
(2)类加载检查通过后,JVM为新生对象分配内存。其中内存的大小在类加载完后即可完全确定,而分配内存空间其实就是在JVM堆中为对象划分出一块确定大小的内存。、
(3)内存分配完成后,虚拟机就将分配到的内存空间全都初始化为0值(不包括对象头)。
(4)虚拟机对对象进行必要的设置,设置对象头。如:对象是哪个类的实例、如何找到元数据信息、对象的哈希码、对象的GC分代年龄等信息。将这些设置信息存放在对象头中。
(5)在虚拟机层面此时已经完成了,但对于程序还应该执行<init>初始化操作。此时对象就创建完成了。
简化记忆过程:
(1)检查类是否加载,没加载就加载。
(2)分配内存
(3)初始化内存空间
(4)设置对象头
(5)完成创建
3、内存分配方式主要分为:指针碰撞、空闲列表
(1)指针碰撞:就是挪动指针,给对象分配一段完整的内存区域,这种方式针对的是堆内存比较完整的情况下。
(2)空闲列表:对于堆内存比较零散的情况下,可用的堆内存保存在空闲列表里面。
选择哪种分配方式,主要是由垃圾收集器的回收机制,是否带有压缩整理功能决定。