gpt4 book ai didi

java - Java 中的实际内存开销是多少?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:46:19 25 4
gpt4 key购买 nike

我已阅读 what-is-the-memory-consumption-of-an-object-in-javawhat-is-the-memory-overhead-of-an-object-in-java .

但我还是一头雾水。

  • 什么是内存开销??是 padding 吗?
  • 什么是带有压缩指针的JVM?是reference吗??
  • 如果使用 32 位 JVM 那么开销会更少吗?当然是的。但是是因为填充吗?
  • 那么,为了内存效率还是为了性能,始终使用 32 位 JVM 哪个更好?

下图来自this link (第26页)

在这张图片中,它们在启动时显示为 16 字节的 JVM 开销,为什么会这样??

enter image description here

最佳答案

What is memory overhead??

当使用的内存多于您创建的字段时。

is it the padding?

一些是填充,它可以出现在对象的任何地方,除了总是在开头的标题。 header 通常有 8-12 个字节长。

What is JVM with compressed pointers?

一种在 64 位 JVM 中使用 32 位指针以节省内存的技术。

is it reference??

引用可以使用这种技术,但指向对象的类信息的指针也可以。

If 32-bit JVM is used then overhead will be less?

可能,尽管这与对引用和类使用压缩指针是一样的。

But is it because of padding?

这是因为 64 位指针比 32 位指针占用更多空间。

So is it better to use always 32-bit JVM for memory efficiency or for performance?

不,32 位处理器模型具有 32 位寄存器,而 64 位模型具有两倍数量的寄存器,其大小是原来的两倍(64 位)意味着最快的内存中可以容纳更多的寄存器,寄存器。使用 64 位处理模型,64 位计算往往也更快。

一般来说,我建议您始终使用 64 位 JVM,除非您 a) 不能或 b) 内存量非常小。

In this image at starting itself they shown as 16 bytes JVM overhead,why that so??

这并不完全正确。这假设您有一个非压缩类引用,因此 header 为 12 字节,但是默认情况下对象是 8 字节对齐的,这意味着在 end 将有 4 个字节的填充(总共 16 个字节但一开始还不是全部)

常见问题解答:为什么 32 位压缩 OOP 可以寻址超过 4 GB

默认情况下,对象必须是 8 字节对齐的。这使内存管理更容易,但有时会浪费一些填充。一个副作用是每个对象的地址的最低三位都是 000(它必须是 8 的倍数)这些位不需要存储。这允许压缩的 oops 寻址 8 * 4 GB 或 32 GB。

使用 16 字节对象对齐,JVM 可以使用 32 位引用寻址 64 GB(但是填充开销更高,可能不值得)

IFAQ:为什么在 28 - 32 GB 左右速度变慢

虽然引用可以乘以 8,但堆并不从内存的起始处开始。它通常在 4 GB 之后开始。这意味着如果您想要完整的 32 GB,则必须添加此偏移量,这会产生轻微的开销。

堆大小:

  • < 4 GB - 零扩展地址
  • 4 - 28 GB - 乘以 8 或 << 3注意:x64 有一条指令支持 double[]long[]
  • 28 - 32 GB - 乘以 8 并添加一个保存偏移量的寄存器。稍微慢一点,但通常不是问题。

关于java - Java 中的实际内存开销是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39992321/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com