繁体   English   中英

Java 包装器和原语 Memory 分配

[英]Java Wrapper & Primitive Memory Allocation

我在采访中被问到以下问题

考虑以下代码

int i =0
Integer e1 = 0
它们将在哪个 memory 中创建?

据我了解

对于int i =0

原始数据类型进入堆栈 memory 和

对于Integer e1 = 0

Integer 是包装器 Class 进入堆 memory

请帮助正确理解?

它比那要复杂一些。

首先,您需要知道iei变量是对象1 的局部变量还是字段(静态或实例)。

如果它们是局部变量:

  • i在堆栈上。
  • ei在堆栈上(一个引用),它指的是堆中的一个对象。

如果它们是实例或类的字段:

  • i在堆上(作为实例或类的一部分)。
  • ei在堆上(作为实例或类的一部分),它引用堆中的一个对象。

最后,值得注意的是, Integer e1 = 0可能根本不会分配新的Integer对象。 e1存储的引用可能是对已经存在的对象的引用。


1 - 还有另一种情况。 如果iei是由内部类声明引用的局部变量,则在实例化内部类时将进行第二次复制。 对于该副本,空间使用情况就像i / ei是内部类的字段一样。

这是一个非常有趣的问题。

使用原语,分配将在堆栈中,并将花费其所需的 4 个字节进行舍入。

但是当谈到包装纸时,事情才真正开始发展。 如果我们将它与 C++ 进行比较,将在堆中分配 4 个字节这一事实使 e1 成为指针。

假设我们使用的是 64 位机器,e1 将占用堆栈中的 8 个字节(+舍入)。

而heap data chunk至少有一个小的4-8bytes header。

在这些类型的实现内部,我没有看到更多的 memory 用于每个实例,因为所有帮助程序成员和常量都是 static,因此所有实例将在用于此类型的“数据段”中使用相同的数据块。

因此,添加所有这些表明包装器的分配将始终大于原语。 例如 - 通过极其粗略的计算,您会得到类似的结果:

原语:int -> 4 字节,包装器:Integer -> 8(stack) + 4 + 4 = 16 字节

至于性能,似乎原语的操作速度比包装器快得多,但这是另一个讨论。

希望这些信息有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM