大家好,我是二哥。
一位微信读者请求帮忙发布招聘帖子,帮助公司招聘人员。中科院的一个研究所作为大家找工作的工具,我就爽快地答应了。
我问了工资,但不知道具体多少,但范围确定是15-30k,我觉得还可以。
尤其是年后打算跳槽的(或者已经被团队紧缩的),可以尝试:基地北京,Java后端岗位,集团内直接晋升。
我还将向您发送职位描述。
您可以点击图片查看放大图
我用文字描述一下,方便大家快速了解关键信息:
基本上,这就是我一直向大家强调的。这几乎是 Java 后端工程师的标配,除了大数据。
如果符合要求,可直接将简历发送至读者邮箱:puc624@aliyun.com
如果要发到二哥的邮箱也可以给你查一下:@163.com
邪面渣逆袭三点
这是一组在 GitHub 上开源的刻板印象。相信很多朋友都已经记住了。面试时与面试官交谈过的朋友可以进行口碑传播。今天我们整理了JVM章节的第9题。这道题涉及到一个新的知识点,叫做TLAB。有兴趣的朋友可以研究一下。
关注即可获取 GitHub 上拥有 13,000+ 颗星的渣男逆袭 PDF 版本(深色、浅色和 epub)。
9. 你能告诉我对象的内存布局吗?
好的
对象的内存布局是由Java虚拟机规范定义的,但具体实现细节各不相同,例如HotSpot和OpenJ9。
以我们常用的HotSpot为例。
对象在内存中包括三部分:对象头、实例数据和对齐填充。
三点邪面渣男逆袭:物体的存储布局是怎样的?请介绍一下对象头的作用?
对象头是对象在内存中存储的元信息,包括Mark Word、类型指针等信息。
Mark Word 存储对象的运行时状态信息,包括锁、哈希值、GC 标记等,在 64 位操作系统下占用 8 个字节,在 32 位操作系统下占用 4 个字节。
类型指针指向对象所属类的元数据,即Class对象,用于支持多态、方法调用等功能。
除此之外,如果对象是数组类型,还会有一个额外的数组长度字段。占用4个字节。
类型指针会被压缩吗?
类型指针可以被压缩以节省内存空间。例如,当压缩指针开启时,占用4个字节,否则占用8个字节。在 JDK 8 中,默认启用压缩指针。
您可以使用 java -XX:+PrintFlagsFinal -version | grep UseCompressedOops 命令检查 JVM 是否启用了压缩指针。
二哥的Java进阶之道:检查JVM是否开启了压缩指针
如果启用压缩指针,则输出结果中的 bool UseCompressedOops 值为 true。
你了解实例数据吗?
学习一些东西。
实例数据是对象的实际字段值,即成员变量的值,按照类中声明字段的顺序存储。
class ObjectDemo {
int age;
String name;
}
JVM 将对齐/重新排列这些数据以提高内存访问速度。
你了解对齐填充吗?
由于JVM的内存模型要求对象的起始地址是8字节对齐的(在64位JVM中),因此对象的总大小必须是8字节的倍数。
如果对象头和实例数据的总长度不是8的倍数,JVM将填充额外的字节以对齐。
例如,对象头+实例数据=14字节,则需要填充2字节,使总长度为16字节。
为什么要进行8字节对齐呢?
因为CPU进行内存访问时,一次寻址的指针大小为8字节,这正是L1缓存行的大小。如果不进行内存对齐,可能会发生跨Cache Line访问,导致额外的Cache Line负载,CPU访问效率会降低。
rickiyang:缓存线污染
例如上图中,obj1占用6个字节。由于缺乏对齐,这一行缓存中多了2个字节的obj2数据。当CPU访问obj2时,缓存行将被刷新。
换句话说,8字节对齐是一种提高效率、以空间换时间的解决方案。
rickiyang: 000 结束 new Object() 对象的内存大小是多少?
一般来说,当前的操作系统都是64位的,JDK 8中默认启用压缩指针。因此,在 64 位 JVM 上,new Object() 的大小为 16 字节(12 字节对象头 + 4 字节对齐填充)。
rickiyang:Java 对象模型
对象头的大小是固定的,32位JVM上为8字节,64位JVM上为16字节;如果启用压缩指针,则为 12 字节。
实例数据的大小取决于对象的成员变量及其类型。对于new Object()来说,由于默认没有成员变量,所以我们可以认为此时的实例数据大小为0。
如果MyObject对象有3个成员变量,分别是int、long和byte类型,那么它们占用的内存大小分别是4字节、8字节和1字节。
class MyObject {
int a; // 4 字节
long b; // 8 字节
byte c; // 1 字节
}
考虑到对齐填充,MyObject 对象的总大小为 12(对象头)+ 4(a) + 8(b) + 1(c) + 7(填充)= 32 字节。
你用过JOL来查看对象的内存布局吗?
用过的。
JOL是一个分析JVM对象布局的工具。
第一步,在pom.xml中引入JOL依赖:
<dependency>
<groupId>org.openjdk.jolgroupId>
<artifactId>jol-coreartifactId>
<version>0.9version>
dependency>
第二步,使用JOL编写代码示例:
public class JOLSample {
public static void main(String[] args) {
// 打印JVM详细信息(可选)
System.out.println(VM.current().details());
// 创建Object实例
Object obj = new Object();
// 打印Object实例的内存布局
String layout = ClassLayout.parseInstance(obj).toPrintable();
System.out.println(layout);
}
}
第三步是运行代码并查看输出:
二哥的Java进阶之路:JOL运行结果
您可以看到信息“偏移量”、“大小”、“类型描述”和“值”。
从上面的结果可以看出,对象头为12字节,有4字节的padding。 New Object()总共有16个字节。
你知道物体的参考尺寸吗?
在64位JVM上,未启用指针压缩时,对象引用占用8个字节;当启用指针压缩时,对象引用被压缩为 4 个字节。 HotSpot虚拟机默认启用压缩指针。
dijia478:对象头
我们来验证一下:
class ReferenceSizeExample {
private static class ReferenceHolder {
Object reference;
}
public static void main(String[] args) {
System.out.println(VM.current().details());
System.out.println(ClassLayout.parseClass(ReferenceHolder.class).toPrintable());
}
}
运行代码并查看输出:
二哥的Java进阶之路:对象的引用有多大?
ReferenceHolder.reference 的大小为 4 个字节。
范阮的3 Java后端原问题包括:Object a = new object()的大小,对象引用占用多少大小?
结束
一个人可以走得快,但一群人可以走得更远。已有超过 6,900 名高尔夫球手加入。如果您也需要优质的学习环境,请加入我们。你可以阅读星球专栏(,,),向二哥提问,帮助你制定学习计划,与球友一起打卡成长。
如果您觉得有帮助,请随意关注。这将是我继续更新的最强烈动力()。
最后,我想向大家传达我二哥的座右铭:没有什么能让我留下来——除了我的目的。即使岸边有玫瑰,有绿荫,有安静的港湾,我也没有被拴在船上。
Copyright C 2018All Rights Reserved 版权所有 丽水招聘网 鄂ICP备2025091810号-6
地址:丽水市经济开发区生态产园集聚区 EMAIL:
Powered by PHPYun.