首页 > 其他分享 >解密社招面试题:“new”一个对象究竟会产生多少字节?

解密社招面试题:“new”一个对象究竟会产生多少字节?

时间:2023-12-28 15:37:46浏览次数:32  
标签:面试题 社招 字节 字节数 对象 占用 填充 内存 new


解密社招面试题:“new”一个对象究竟会产生多少字节?_字节数

尊敬的小伙伴们,大家好!

在程序员的职业生涯中,面试无疑是一次又一次的挑战。这些挑战中,总有一些问题会让我们略感头疼,今天小米就来和大家聊一聊,社招面试中经常被问到的一个问题:“new”一个对象究竟会产生多少字节?

这个问题看似简单,实际上涉及到了许多底层的原理,而在我们日常开发中,也有着实际的应用。让我们一起深入挖掘,揭开这个谜题的面纱吧!

对象创建的背后

在开始之前,我们先来回顾一下对象的创建过程。当我们使用new关键字创建一个对象时,背后发生了哪些事情呢?

  • 分配内存空间: 首先,系统会为新对象分配一块内存空间,这个空间的大小取决于对象的类型和属性。
  • 初始化对象: 分配好内存后,系统会根据对象的定义,对对象进行初始化,给各个属性赋予默认值。
  • 调用构造函数: 如果有构造函数,系统会调用该构造函数,执行一些额外的初始化操作。

这个过程看似简单,但其中涉及到了许多底层的内存管理和对象初始化的工作。

对象的内存占用

接下来,我们就来详细探讨一下,一个对象到底占用多少字节的内存呢?

  • 对象头: 在内存中,每个对象都有一个对象头,用于存储一些元信息,比如对象的锁信息、哈希码等。这个对象头的大小在不同的虚拟机和操作系统中可能会有所不同。在32位系统上,对象头通常占用8个字节,而在64位系统上,由于寻址空间的增大,对象头占用的空间一般是12个字节。
  • 实例数据: 这部分用于存储对象的实际数据,即我们在类中定义的各个属性。每个属性占用的空间取决于其类型和对齐方式。
  • 填充字节: 由于计算机内存对齐的要求,可能会在实例数据之间插入一些填充字节,以确保数据的对齐。

考虑到这些因素,我们可以得出一个简化的公式:

  • 总字节数=对象头大小+实例数据大小+填充字节数

不同对象的内存占用

既然我们知道了内存占用的基本构成,那么不同类型的对象会有不同的内存占用吗?

  • 基本数据类型: 对于基本数据类型,比如int、char等,在32位系统上通常占用4个字节,而在64位系统上占用8个字节。
  • 引用类型: 对于引用类型,即对象类型,内存占用则更为复杂。除了对象头、实例数据和填充字节外,还要考虑引用的大小。在不同的虚拟机中,一个引用在32位系统上,通常占用4个字节,而在64位系统上则需要8个字节。

实际案例分析

让我们通过一个简单的案例来具体分析一下。考虑以下Java类:

解密社招面试题:“new”一个对象究竟会产生多少字节?_数据_02

  • 对象头大小: 在32位系统上,占用8个字节。
  • 实例数据大小:int占4字节,double占8字节,String引用占4字节(32位系统)。
  • 填充字节数: 填充字节数使得实例数据的起始地址是8的倍数。

带入上述公式,我们可以计算出MyClass对象的总字节数:

  • 总字节数=8+4+8+4+填充字节数

通过具体计算,我们可以得出MyClass对象的内存占用大小。

优化内存占用

在实际开发中,优化内存占用是一个重要的考虑因素。有一些技巧可以帮助我们减小对象的内存占用:

  • 避免不必要的字段: 不需要的字段就不要定义,减少不必要的内存占用。
  • 使用基本数据类型: 在不影响业务逻辑的情况下,尽量使用基本数据类型而不是引用类型。
  • 对象池技术: 对于某些频繁创建和销毁的对象,可以考虑使用对象池技术,复用已有对象,减少内存开销。

END

通过今天的分享,我们对“new”一个对象会产生多少字节有了更深入的了解。在面试时,对这个问题的回答不仅要考虑基本的对象构建过程,还要考虑到对象头、引用大小等因素,展现出对底层原理的理解。

同时,在实际开发中,我们也要注意优化内存占用,提高系统的性能和稳定性。希望今天的分享能够对大家有所帮助!

感谢大家的耐心阅读,如果有任何问题或建议,欢迎留言讨论。小米科技,和你一起探索代码的奇妙世界!

如有疑问或者更多的技术分享,欢迎关注我的微信公众号“知其然亦知其所以然”!

标签:面试题,社招,字节,字节数,对象,占用,填充,内存,new
From: https://blog.51cto.com/u_16237826/9015252

相关文章

  • 2023最新中级难度Fast API面试题,包含答案。刷题必备!记录一下。
    好记性不如烂笔头内容来自[面试宝典-中级难度FastAPI面试题合集](https://offer.houxu6.top/tag/FastAPI)问:FastAPI是一个基于HTTP协议的PythonWeb框架,请问FastAPI有哪些特点和优势?FastAPI是一个现代、高性能的PythonWeb框架,用于构建RESTfulAPI和Web服务。以下是Fas......
  • 2023最新高级难度Fast API面试题,包含答案。刷题必备!记录一下。
    好记性不如烂笔头内容来自[面试宝典-高级难度FastAPI面试题合集](https://offer.houxu6.top/tag/FastAPI)问:请简述FastAPI的优缺点,并给出一些应用场景。FastAPI是一个现代、快速且高性能的PythonWeb框架,用于构建RESTfulAPI和Web应用。它基于标准的Python类......
  • 2023最新中级难度Django面试题,包含答案。刷题必备!记录一下。
    好记性不如烂笔头内容来自面试宝典-中级难度Django面试题合集问:请解释Django的ORM是什么,它是如何工作的?Django的ORM(Object-RelationalMapping)是一种用于将数据库操作映射到Python对象上的技术。ORM提供了一种面向对象的方式来处理数据库,允许开发者通过定义模型......
  • 2023最新高级难度Django面试题,包含答案。刷题必备!记录一下。
    好记性不如烂笔头内容来自面试宝典-高级难度Django面试题合集问:请问Django中的序列化是什么,有哪些常见的序列化方式?在Django框架中,序列化(Serialization)是指将Python对象(如模型实例或查询集)转换为适合存储或传输的数据格式的过程。常见的数据格式包括JSON、XML、CSV等。反......
  • 2023最新中级难度汇编语言面试题,包含答案。刷题必备!记录一下。
    好记性不如烂笔头内容来自面试宝典-中级难度汇编语言面试题合集问:解释一下宏汇编语言(MacroAssemblyLanguage)是什么?请举例说明如何使用宏汇编语言进行代码开发。宏汇编语言(MacroAssemblyLanguage,MASM)是一种扩展了基本汇编语言功能的编程工具。它允许程序员定义和使用......
  • 2023最新高级难度汇编语言面试题,包含答案。刷题必备!记录一下。
    好记性不如烂笔头内容来自面试宝典-高级难度汇编语言面试题合集问:在汇编语言中,什么是宏指令(MacroInstruction)?请解释一下宏指令的概念和使用方式。在汇编语言中,宏指令(MacroInstruction)是一种用于简化代码编写和维护的预处理工具。宏定义允许程序员将一个或多个复杂的指......
  • js一道try...catch的面试题
    说到try...catch都觉得非常熟悉了,不就是用来捕捉代码块中的错误嘛,平时也用得比较多的。然而因为了解不够多,我的面试却栽在了一个简单的知识点上:try...catch只能捕捉到同步执行代码块中的错误。题目是:以下代码有错吗?如果有错,应该如何改正?try{setTimeout(()=>{thrown......
  • 2023最新中级难度R语言面试题,包含答案。刷题必备!记录一下。
    好记性不如烂笔头内容来自面试宝典-中级难度R语言面试题合集问:请解释一下R语言中的向量(vector)和列表(list)有什么区别?R语言中的向量(vector)和列表(list)是两种非常基本的数据结构,它们有一些重要的区别:数据类型:向量:在R中,向量是同质的,即所有元素必须是相同的数据类型。例如......
  • 2023最新高级难度R语言面试题,包含答案。刷题必备!记录一下。
    好记性不如烂笔头内容来自面试宝典-高级难度R语言面试题合集问:请解释一下R语言中的闭包(closure)是什么,并举一个例子说明如何使用闭包来实现柯里化(currying)函数。在R语言中,闭包是一种特殊的函数,它能够记住并访问在其外部定义的变量。当一个函数被定义在一个环境中,并且这个......
  • __new__(cls)方法详解
    只要是面向对象的编程语言,类的实例化一定包含两个步骤:(1)在内存中创建对象,即开辟一块内存空间来存放类的实例化对象(Instance);(2)初始化对象,即给实例的属性赋予初始值。在python中,第一步由__new__函数负责,第二步由__init__函数负责。__new__的返回值是__init__中的self如果__n......