![](/img/trans.png)
[英]Does primitive wrapper instantiation cause memory allocation in JDK 1.6
[英]Java Wrapper & Primitive Memory Allocation
我在采访中被问到以下问题
考虑以下代码
int i =0
Integer e1 = 0
它们将在哪个 memory 中创建?
据我了解
对于
int i =0
原始数据类型进入堆栈 memory 和
对于
Integer e1 = 0
Integer 是包装器 Class 进入堆 memory
请帮助正确理解?
它比那要复杂一些。
首先,您需要知道i
和ei
变量是对象1 的局部变量还是字段(静态或实例)。
如果它们是局部变量:
i
在堆栈上。ei
在堆栈上(一个引用),它指的是堆中的一个对象。如果它们是实例或类的字段:
i
在堆上(作为实例或类的一部分)。ei
在堆上(作为实例或类的一部分),它引用堆中的一个对象。 最后,值得注意的是, Integer e1 = 0
可能根本不会分配新的Integer
对象。 e1
存储的引用可能是对已经存在的对象的引用。
1 - 还有另一种情况。 如果i
或ei
是由内部类声明引用的局部变量,则在实例化内部类时将进行第二次复制。 对于该副本,空间使用情况就像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.