面试官:Java中new Object()到底占用几个字节

让我来详细讲解一下Java中new Object()到底占用几个字节。

Java中new Object()的内存分配

在Java中,每当使用new关键字创建一个新的对象时,JVM就会在堆(Heap)中为该对象分配内存空间。对于一个标准的Object对象,它占用的空间大小可以通过Java虚拟机规范中的定义进行推算。

根据Java虚拟机规范,每个对象的大小受到以下几个因素的影响:

1.对象头(Object Header)的大小
2.对象中包含的实例变量(Instance Variables)的大小
3.对象内存对齐(Object Alignment)的大小

其中,对象内存对齐最终会将对象的大小调整为8的倍数(因为在Java虚拟机中,对象内存都按照8字节对齐)。而对象头的大小则受到所在虚拟机的影响,例如在32位虚拟机中对象头大小为8字节(4字节哈希值+4字节类型指针);在64位虚拟机中对象头大小为16字节(8字节哈希值+4字节类型指针+4字节补充位)。

综上所述,当我们创建一个标准的Object对象时,它的具体大小根据所在虚拟机的位数而定。但大致上,它所占用的大小应该为:8字节(对象头)+对齐后的4字节 = 12字节。

示例1

public class ObjectSizeDemo {
    public static void main(String[] args) {
        Object obj = new Object();
        System.out.println("Object对象占用:" + memorySizeOf(obj) + " bytes");
    }

    public static long memorySizeOf(Object obj) {
        return InstrumentationAgent.getObjectSize(obj);
    }
}

class InstrumentationAgent {
    private static Instrumentation instrumentation;

    public static void premain(String agentArgs, Instrumentation inst) {
        instrumentation = inst;
    }

    public static long getObjectSize(Object obj) {
        return instrumentation.getObjectSize(obj);
    }
}

上述示例中,我们通过使用Java Agent实现了内存大小的测量,该实现方式利用了Java提供的Instrumentation接口,该接口的getObjectSize方法可以获取一个对象的内存大小。

示例中的main方法中,我们创建了一个Object对象,并使用自定义的memorySizeOf方法获取该对象的占用空间。根据Java虚拟机的内存分配规则,该Object对象所占用的空间应该为12字节(8字节对象头+4字节对齐),因此输出结果为Object对象占用:12 bytes。

示例2

public class ObjectArraySizeDemo {
    public static void main(String[] args) {
        Object[] objArray = new Object[3];
        objArray[0] = new Object();
        System.out.println("Object数组占用:" + memorySizeOf(objArray) + " bytes");
    }

    public static long memorySizeOf(Object obj) {
        return InstrumentationAgent.getObjectSize(obj);
    }
}

class InstrumentationAgent {
    private static Instrumentation instrumentation;

    public static void premain(String agentArgs, Instrumentation inst) {
        instrumentation = inst;
    }

    public static long getObjectSize(Object obj) {
        return instrumentation.getObjectSize(obj);
    }
}

上述示例中,我们在main方法中创建了一个长度为3的Object数组,并将其第一个元素设为新构建的Object对象。同样地,我们利用Java Agent的方式获取该Object数组所占用的空间。

根据Java虚拟机的内存分配规则,该Object数组的占用空间由数组对象头和3个Object对象共同组成。因此,其占用空间应该为:

8字节数组对象头+34字节(数组中有3个指向Object对象的指针)+3(8字节对象头+4字节对齐)=44字节

因此,输出结果为Object数组占用:44 bytes。

总结

通过以上两个示例,我们可以看到在Java虚拟机中,使用new Object()所创建的对象占用的空间大小是由对象头的大小、实例变量的大小、对象内存对齐三个因素共同影响的。具体方式可以通过Java Agent相关的API来获取。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:面试官:Java中new Object()到底占用几个字节 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • Hadoop中的压缩与解压缩案例详解

    下面就为您详细讲解“Hadoop中的压缩与解压缩案例详解”的完整攻略。 什么是Hadoop中的压缩与解压缩? 在Hadoop中,由于数据量通常都很大,为了提高数据的存储效率和运行效率,我们经常需要将数据进行压缩。同时,在MapReduce的过程中,也需要对数据进行解压缩以方便处理。 Hadoop支持多种数据压缩格式,包括Gzip、Bzip2、LZO等。在使用…

    Java 2023年5月20日
    00
  • Java中 shuffle 算法的使用

    Java中 shuffle 算法的使用 shuffle算法是一种用于打乱集合顺序的算法。在Java中,我们可以使用Collections类提供的shuffle()静态方法来应用该算法。 shuffle()方法签名 public static void shuffle(List<?> list) shuffle()方法参数说明 list:要打乱顺序…

    Java 2023年5月19日
    00
  • Java和SQL实现取两个字符间的值

    要实现取两个字符间的值,可以使用Java的字符串截取和SQL的substr函数两种方法。 Java实现 1. 使用String.substring方法 使用String.substring方法可以截取原字符串中两个索引位置之间的子串。 String str = "Hello World"; String result = str.subs…

    Java 2023年5月27日
    00
  • 解决Java中properties文件编码问题

    解决Java中properties文件编码问题可以按照以下步骤进行: 1. 观察properties文件的编码格式 首先需要确定properties文件的编码格式。常见的编码格式有ANSI、UTF-8、UTF-16等等。可以使用文本编辑器打开properties文件,查看编码格式。 2. 使用正确的字符集读取properties文件 读取properties…

    Java 2023年5月20日
    00
  • 如何通过java获取文件名和扩展名

    获取文件名和扩展名是Java中一个常见的操作。下面我来详细讲解Java中如何获取一个文件的文件名和扩展名。 获取文件名 Java中可以使用File类来表示一个文件。获取一个文件的文件名可以使用File类提供的getName()方法,示例如下: File file = new File("D:/test/hello.txt"); Strin…

    Java 2023年5月20日
    00
  • RHEL5 Apache+Tomcat整合,同时支持jsp与php

    RHEL5 Apache+Tomcat整合,同时支持jsp与php 在Linux系统中,我们常常需要将Apache和Tomcat进行整合,同时支持jsp和php的运行。本文将提供一份完整的攻略来实现这一目的。以下是整合的具体步骤: 步骤一:配置Apache的mod_jk模块 首先,我们需要在Linux系统中安装Apache及其模块。使用yum工具即可完成,详…

    Java 2023年5月19日
    00
  • 微信小程序实现人脸识别登陆的示例代码

    首先要说明的是微信小程序实现人脸识别登陆需要依赖于第三方人脸识别的API,比如阿里云人脸识别API、百度AI人脸识别API等。以下以阿里云人脸识别API为例,讲解微信小程序实现人脸识别登陆的步骤。 注册阿里云账号并开通人脸识别API在阿里云官网注册账号并登录后,进入人脸识别产品页,点击“立即登录/注册”进入API管理控制台,按照指引完成API开通与认证流程,…

    Java 2023年5月23日
    00
  • Spring boot异步任务原理全面分析

    Spring Boot异步任务原理全面分析 Spring Boot提供了异步任务的支持,可以让我们在处理一些耗时的操作时,不会阻塞主线程,提高应用程序的性能和响应速度。本文将介绍Spring Boot异步任务的原理和使用方法,并提供两个示例,演示如何使用Spring Boot异步任务。 1. 异步任务原理 Spring Boot异步任务的实现原理是基于Jav…

    Java 2023年5月14日
    00
合作推广
合作推广
分享本页
返回顶部