面试官: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日

相关文章

  • java和Spring中观察者模式的应用详解

    我来详细讲解一下“java和Spring中观察者模式的应用详解”的完整攻略。 什么是观察者模式? 观察者模式(Observer Pattern)是一种行为型设计模式,也叫做发布-订阅模式(Publish/Subscribe),用于定义对象之间的一种一对多的依赖关系。当一个对象的状态改变时,所有依赖于它的对象都会收到通知并自动更新。观察者模式的核心思想就是解耦…

    Java 2023年5月20日
    00
  • Java转JSON串的几种方式

    Java转JSON串的几种方式: 在Java开发中,将Java对象转化成JSON格式数据是很常见的一项操作。下面是几种常见的方式: 1. 使用Gson Gson是Google提供的一个Java JSON库,可以将JSON字符串和Java对象互相转化。可以通过以下步骤来使用Gson将Java对象转化成JSON格式数据: 引入Gson依赖: “` com.go…

    Java 2023年5月26日
    00
  • Maven 修改tomcat运行版本和端口的实现方法

    以下是“Maven 修改 Tomcat 运行版本和端口的实现方法”的攻略。 介绍 Maven是一个Java项目管理工具,可以自动化构建,依赖管理,以及项目信息管理。它的一个重要作用就是可以将项目打包成一个可以部署的War包。而Tomcat是一个Java Web应用程序服务器,可以运行打包好的War包。 在Maven的项目中,我们可以使用插件来管理Tomcat…

    Java 2023年5月20日
    00
  • java模拟ATM功能(控制台连接Mysql数据库)

    以下是详细讲解“java模拟ATM功能(控制台连接Mysql数据库)”的完整攻略: 系统要求 JDK 1.8 或以上版本 Mysql 5.0 或以上版本 准备工作 创建一个名为 atm 的 Mysql 数据库 CREATE DATABASE atm; 创建一个名为 users 的表,用于储存 ATM 用户信息 USE atm; CREATE TABLE us…

    Java 2023年5月20日
    00
  • Spring Security 在 Spring Boot 中的使用详解【集中式】

    下面是对于 “Spring Security 在 Spring Boot 中的使用详解【集中式】” 的完整攻略。 一、什么是 Spring Security Spring Security 是 Spring 生态圈中基于安全框架的一款开源工具。它能够帮助我们实现应用程序的安全控制,保证我们的应用程序在面临安全威胁时能够做出正确的响应。 二、Spring Se…

    Java 2023年5月20日
    00
  • MyBatis-Plus拦截器对敏感数据实现加密

    大家好,我是网站的作者,本次将为大家讲解如何对敏感数据实现加密,使用的工具是MyBatis-Plus拦截器。下文将分为以下几个部分: MyBatis-Plus拦截器简介 敏感数据加密的必要性 敏感数据加密的具体实现 示例说明 MyBatis-Plus拦截器简介 MyBatis-Plus是MyBatis的增强工具包,提供了丰富的功能,包括但不限于自动生成代码、…

    Java 2023年5月26日
    00
  • 详解Reactor如何优雅Exception异常处理

    详解Reactor如何优雅Exception异常处理 在使用Reactor进行响应式编程的过程中,异常处理是一个非常重要的部分。优雅地处理异常,可以让代码更加健壮和可靠。本文将详细讲解Reactor如何优雅地处理异常。 直接捕获异常 Reactor提供了onError方法来处理异常。当流中出现异常时,可以直接调用onError方法来捕获异常。 Flux.ju…

    Java 2023年5月27日
    00
  • SpringBoot发现最新版Druid重大问题(坑)

    SpringBoot发现最新版Druid重大问题(坑)攻略 问题描述 最近,在使用 SpringBoot 和 Druid 进行数据库连接池配置的时候,发现了一个最新版 Druid 的重大问题。具体表现就是,在使用了最新版 Druid 后,产生了以下的错误信息: 错误信息:Cannot create JDBC driver of class ‘com.mysq…

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