廊坊营销网站团队,网站建设海之睿,成都防疫政策最新,百度关键词挖掘工具爱站网目录 概述对象里的三个区对象头验证代码控制台输出分析 验证2代码控制台输出 实例数据对其填充 访问对象结束 概述 jvm对象内存布局详解。 相关文章在此总结如下#xff1a;
文章地址jvm基本知识地址jvm类加载系统地址双亲委派模型与打破双亲委派地址运行时数据区地址运行时数… 目录 概述对象里的三个区对象头验证代码控制台输出分析 验证2代码控制台输出 实例数据对其填充 访问对象结束 概述 jvm对象内存布局详解。 相关文章在此总结如下
文章地址jvm基本知识地址jvm类加载系统地址双亲委派模型与打破双亲委派地址运行时数据区地址运行时数据区-字符串常量池、程序计数器、直接内存地址jvm中对象创建流程与内存分配地址
对象里的三个区
对象里有啥
对象头
对象头8字节如果是数组12字节(记录数组长度占4字节) 标记字段存储对象运行时自身数据 默认对象Hashcode、GC分代年龄、锁状态存储数据结构并不是固定的 类型指针对象指向类元数据的指针 开启指针压缩占4字节、不开启8字节 (jdk1.6之后默认是开启的) 数组长度如果是数组则记录数组长度占4个字节 对其填充保证数组(针对的是数组)的大小永远是8字节的整数倍 32位Markword是可变的数据结构对象头总大小固定8字节Markword 占4个字节共32位。 64位Markword是可变的数据结构对象头总大小固定12字节验证
打印空对象的内存而已信息
代码
dependencygroupIdorg.openjdk.jol/groupIdartifactIdjol-core/artifactIdversion0.9/version
/dependency执行代码
package com.fun.info;import org.openjdk.jol.info.ClassLayout;public class ObjLock {public static void main(String[] args) {Object o new Object();System.out.println(new Object: ClassLayout.parseInstance(o).toPrintable());}
}控制台输出 分析
首先对象头是包含 Markword 和 类型指针 这两部分信息开启指针压缩的情况下存放 Class 指针的空间大小是4字节Markword是8字节对象头为12个字节新建 Object 对象会在内存占用16个字节其中 Header 占12个(Markword 占8个 ClassPoint 占 4个)没有实例数据补充对齐 4 个字节
验证2
基本数据类型和包装类的内存占用情况
数据类型内存占用 (byte)boolean1byte1short1char2int4float4long8double8Boolean4Byte4Short4Character4Integer4Float4Long4Double4
代码
package com.fun.info;import org.openjdk.jol.info.ClassLayout;public class ObjLock2 {public static void main(String[] args) {Student o new Student();System.out.println(new Object: ClassLayout.parseInstance(o).toPrintable());o.setAge(10);o.setFlag(true);o.setName(abc);System.out.println(赋值 new Object: ClassLayout.parseInstance(o).toPrintable());}static class Student{private boolean flag;private int age;private String name;public boolean isFlag() {return flag;}public void setFlag(boolean flag) {this.flag flag;}public void setAge(int age) {this.age age;}public void setName(String name) {this.name name;}}
}控制台输出 总结 对象从创建对象的大小就已确定了。
实例数据
对象内部的成员变量
对其填充
8字节对象保证对象大小是8字节的整数倍。
访问对象
如何访问对象 两种方式如上两图
1.句柄2.直接指针
结束
至此jvm对象内存布局就说得明明白白了如有疑问欢迎评论区留言。