一、java对象的内存布局
一个Java对象在内存中包括3个部分:对象头、实例数据和对齐填充二、验证hashCode的储存方式
使用jol工具导入对应包、<dependency> <groupId>org.openjdk.jol</groupId> <artifactId>jol-core</artifactId> <version>RELEASE</version> </dependency>
public class Worker {
private Integer id;
private String username;
private String password;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getpassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return super.toString ();
}
public static void printf(Worker p) {
// 查看对象的整体结构信息
// JOL工具类
System.out.println( ClassLayout.parseInstance(p).toPrintable());
}
}
public class Test {
public static void main(String[] args) {
Worker work = new Worker();
//输出对象信息
System.out.println(work.hashCode());
System.out.println(work);
//输出信息
Worker.printf(work);
}
}
2052001577这个数字是我们的HashCode值,转换成16进制可得7a 4f 0f 29,经过对比。
由此可得,我们的哈希码使用的大端储存。例如:小端存储:便于数据之间的类型转换,例如:long类型转换为int类型时,高地址部分的数据可以直接截掉。 大端存储:便于数据类型的符号判断,因为最低地址位数据即为符号位,可以直接判断数据的正负号。
十进制数9877,如果用小端存储表示则为:
高地址 <- - - - - - - - 低地址
10010101`[高序字节]` 00100110`[低序字节]`
用大端存储表示则为:
高地址 <- - - - - - - - 低地址
00100110`[低序字节]` 10010101`[高序字节]`
2.1、Class Pointer
引用定位到对象的方式有两种,一种叫句柄池访问,一种叫直接访问
关闭指针压缩 : -XX:+UseCompressedOops对齐填充 没有对齐填充就可能会存在数据跨内存地址区域存储的情况,在没有对齐填充的情况下,内存地址存放情况如下:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。