jvm-04.对象的内存布局
2021/7/3 7:21:49
本文主要是介绍jvm-04.对象的内存布局,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
对象的内存布局
对象的创建
Object o = new Object();
内存中有一个变量o指向new出来的对象,
蓝色区域代表的就是对象。
半初始化问题
通过new创建对象时分为三步:
第一步申请分配内存,这一步给成员变量赋默认值,
第二步调用构造方法,这一步给成员变量赋初始值,
第三步建立指针与对象的关联。
第二步是为了解决c++ 变量遗留值的问题,
是上一个程序访问过这块空间遗留下的值,安全起见先赋默认值。
对象的布局
普通对象
分为4个部分:
markword
8个字节
class pointer
4个或8个字节,指向对应的class
instance data
对象的内部数据,例如成员变量
padding
将字节数长度拼接到可以被8整除
我们可以用JOL类库来演示一下
<!-- https://mvnrepository.com/artifact/org.openjdk.jol/jol-core --> <dependency> <groupId>org.openjdk.jol</groupId> <artifactId>jol-core</artifactId> <version>0.16</version> <scope>provided</scope> </dependency>
ObjectLayout
package com.duohoob.jvm.bytecode; import org.openjdk.jol.info.ClassLayout; @SuppressWarnings("unused") public class ObjectLayout { private static class T { int a, b; } public static void main(String[] args) { T t = new T(); System.out.println(ClassLayout.parseInstance(t).toPrintable()); } }
运行
com.duohoob.jvm.bytecode.ObjectLayout$T object internals: OFF SZ TYPE DESCRIPTION VALUE 0 8 (object header: mark) 0x0000000000000001 (non-biasable; age: 0) 8 4 (object header: class) 0xf800c043 12 4 int T.a 0 16 4 int T.b 0 20 4 (object alignment gap) Instance size: 24 bytes Space losses: 0 bytes internal + 4 bytes external = 4 bytes total
数组
多了个数组长度
对象头包含什么
对象头包含markword、class pointer信息,
markword包含hashCode信息、synchronized锁信息、GC垃圾回收标记。
GC标记包含三色标记信息和分代年龄。
对象的定位
直接指针
堆中的是实例对象,方法区中的是类型class。
间接指针
优点:垃圾回收不用频繁改动t。
缺点:慢,需要先定位到指针,再定位到对象,两次访问。
对象的分配
函数内的局部变量,
new的时候会先尝试在自己的栈帧内部分配空间,
例如for循环内通过new创建对象,
方法执行完毕,栈帧自动弹出,释放掉空间。
逃逸分析
分析函数内部的创建出的对象,
除了当前栈帧还有没有被其它栈帧调用,
是否逃出了当前栈帧管控范围,
如果有则不能再栈上分配,只能分配在堆上。
这篇关于jvm-04.对象的内存布局的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-06-26结对编程到底难不难?答案在这里
- 2024-06-19《2023版Java工程师》课程升级公告
- 2024-06-15matplotlib作图不显示3D图,怎么办?
- 2024-06-1503-Loki 日志监控
- 2024-06-1504-让LLM理解知识 -Prompt
- 2024-06-05做软件测试需要懂代码吗?
- 2024-06-0514-ShardingSphere的分布式主键实现
- 2024-06-03为什么以及如何要进行架构设计权衡?
- 2024-05-31全网首发第二弹!软考2024年5月《软件设计师》真题+解析+答案!(11-20题)
- 2024-05-31全网首发!软考2024年5月《软件设计师》真题+解析+答案!(21-30题)