百度大牛教你面试必备技巧Java中new Object...

本文深入探讨了Java中new Object()在内存中的占用情况,分析了对象在堆内存的布局,包括对象头、实例数据和对齐填充。通过示例解释了在开启和关闭指针压缩的情况下,new Object()占用的字节数。同时,文章讨论了对象访问的两种方式:句柄访问和直接指针访问,以及Java堆内存的分代年龄和分区策略,如Young区、Old区、Eden区和Survivor区的工作流程。
摘要由CSDN通过智能技术生成

这篇文章主要介绍了面试官:Java中new Object()到底占用几个字节,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

我们来分析一下堆内布局以及Java对象在内存中的布局吧。

对象的指向*
先来看一段代码:

package com.zwx.jvm;
 
public class HeapMemory {
   
  private Object obj1 = new Object();
 
  public static void main(String[] args) {
   
    Object obj2 = new Object();
  }
}

上面的代码中,obj1 和obj2在内存中有什么区别?

我们先来回忆一下JVM系列1的文章中有提到,方法区存储每个类的结构,比如:运行时常量池、属性和方法数据,以及方法和构造函数等数据。所以我们这个obj1是存在方法区的,而new会创建一个对象实例,对象实例是存储在堆内的,于是就有了下面这幅图(方法区指向堆):

在这里插入图片描述

而obj2 是属于方法内的局部变量,存储在Java虚拟机栈内的栈帧中的局部变量表内,这就是经典的栈指向堆:
在这里插入图片描述

这里我们再来思考一下,我们一个变量指向了堆,而堆内只是存储了一个实例对象,那么堆内的示例对象是如何知道自己属于哪个Class,也就是说这个实例是如何知道自己所对应的类元信息的呢?这就涉及到了一个Java对象在内存中是如何布局的。

Java内存模型

对象内存中可以分为三块区域:对象头(Header),实例数据(Instance Data)和对齐填充(Padding),以64位操作系统为例(未开启指针压缩的情况)Java对象布局如下图所示:

在这里插入图片描述

其中对象头中的Mark Word中的详细信息在文章synchronized锁升级原理中有详细介绍。上图中的对齐填充不是一定有的,如果对象头和实例数据加起来刚好是8字节的倍数,那么就不需要对齐填充。
知道了Java内存布局,那么我们来看一个面试问题

Object obj=new Object(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值