JVM中对象的创建
2021-06-03 17:22:10 9 举报
JVM中对象的创建
作者其他创作
大纲/内容
分配内存的方式(根据所采用的垃圾收集器是否带有压缩整理功能决定):1. 指针碰撞(Bump the Pointer):Java堆中内存是绝对规整的,所有用过的内存在一边,空闲的内存在另一边,中间放着一个指针作为分界点的指示器,分配内存时,只需将指针向空闲内存挪动一段与对象大小相等的距离。2. 空闲列表(Free List):Java堆中的内存并不是规整的,已使用的内存和未使用的内存相互交错,虚拟机维护一个列表,记录哪些内存是可用的,在分配的时候从列表中找到一块足够大的空间划分给对象实例,并更新列表上的记录。
对象在内存中的存储分布:1. 对象头(Header)2. 实例数据(Instance Data):对象真正存储有效信息的部分3. 对齐填充(padding):保证对象的大小必须是8字节的整倍数(HotSpot VM)
JVM遇到new指令
为新生对象分配内存(对象所需内存的大小在类加载完成后便可以完全确定)
将分配到的内存空间初始化
是
根据字节码中是否跟随invokespecial指定,决定是否执行<init>方法。<init>是按照程序员的意愿进行初始化
执行类加载过程
否
检查这个符号引用代表的类是否已被加载、解析和初始化过
检查这个指令的参数是否能在常量池中定位一个类的符号引用
对象头(Header)包括:1. Mark Word:存储对象自身的运行时数据,如HashCode、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等2. 类型指针:指向它的类元数据的指针,JVM通过这个指针来确定这个对象是哪个类的实例。但是,并不是所有的JVM实现都必须在对象数据是上保留类型指针,换句话说,查找对象的元数据信息并不一定要经过对象本身3. 数组长度:如果对象是一个Java数组,则在数组长度的数据存放在对象头中。
JVM对对象进行必要的设置,如对象是哪个类的实例、如何才能找到类的元数据信息、对象的Hash码、对象的GC分代年龄等信息。这些信息存放在对象的对象头中。
0 条评论
下一页