java 中的实际内存开销是多少?
What actually memory overhead is in java?
我已阅读what-is-the-memory-consumption-of-an-object-in-java and what-is-the-memory-overhead-of-an-object-in-java。
但我还是一头雾水
- 什么是内存开销??是
padding
?
- 什么是
JVM
压缩指针?是 reference
??
- 如果使用
32-bit JVM
那么开销会更少吗?当然 yes.But 是因为padding吗?
- 那么总是使用
32-bit JVM
是为了提高内存效率还是为了性能更好?
下图来自this link(第26页)
在这张图片中,它们在启动时显示为 16 字节 JVM 开销,为什么这样??
What is memory overhead??
当使用的内存多于您创建的字段时。
is it the padding?
有些是填充,可以出现在 object 中的任何位置,除了总是在开头的 header。 header 通常是 8-12 个字节长。
What is JVM with compressed pointers?
一种在 64 位 JVM 中使用 32 位指针以节省内存的技术。
is it reference??
引用可以使用这种技术,但指向 object 的 class 信息的指针也可以。
If 32-bit JVM is used then overhead will be less?
可能,尽管这与使用压缩指针作为引用和 classes 相同。
But is it because of padding?
这是因为 64 位指针比 32 位指针使用更多 space。
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??
这并不完全正确。这假设您有一个非压缩的 class 引用,因此 header 是 12 字节,但是 object 默认情况下是 8 字节对齐的,这意味着将有 4 个字节的填充end(总共16个字节,但不是全部在开头)
常见问题解答:为什么 32 位压缩 OOP 可以寻址超过 4 GB
Object 必须默认为 8 字节对齐。这使内存管理更容易,但有时会浪费一些填充。一个副作用是每个 object 的地址的最低三位都是 000(它必须是 8 的倍数)这些位不需要存储。这允许压缩 oops 寻址 8 * 4 GB 或 32 GB。
使用 16 字节 object 对齐,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 并添加一个保存偏移量的寄存器。稍微慢一点,但通常不是问题。
我已阅读what-is-the-memory-consumption-of-an-object-in-java and what-is-the-memory-overhead-of-an-object-in-java。
但我还是一头雾水
- 什么是内存开销??是
padding
? - 什么是
JVM
压缩指针?是reference
?? - 如果使用
32-bit JVM
那么开销会更少吗?当然 yes.But 是因为padding吗? - 那么总是使用
32-bit JVM
是为了提高内存效率还是为了性能更好?
下图来自this link(第26页)
在这张图片中,它们在启动时显示为 16 字节 JVM 开销,为什么这样??
What is memory overhead??
当使用的内存多于您创建的字段时。
is it the padding?
有些是填充,可以出现在 object 中的任何位置,除了总是在开头的 header。 header 通常是 8-12 个字节长。
What is JVM with compressed pointers?
一种在 64 位 JVM 中使用 32 位指针以节省内存的技术。
is it reference??
引用可以使用这种技术,但指向 object 的 class 信息的指针也可以。
If 32-bit JVM is used then overhead will be less?
可能,尽管这与使用压缩指针作为引用和 classes 相同。
But is it because of padding?
这是因为 64 位指针比 32 位指针使用更多 space。
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??
这并不完全正确。这假设您有一个非压缩的 class 引用,因此 header 是 12 字节,但是 object 默认情况下是 8 字节对齐的,这意味着将有 4 个字节的填充end(总共16个字节,但不是全部在开头)
常见问题解答:为什么 32 位压缩 OOP 可以寻址超过 4 GB
Object 必须默认为 8 字节对齐。这使内存管理更容易,但有时会浪费一些填充。一个副作用是每个 object 的地址的最低三位都是 000(它必须是 8 的倍数)这些位不需要存储。这允许压缩 oops 寻址 8 * 4 GB 或 32 GB。
使用 16 字节 object 对齐,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 并添加一个保存偏移量的寄存器。稍微慢一点,但通常不是问题。