【问题标题】:Memory Allocation in Java Is DoubledJava 中的内存分配翻倍
【发布时间】:2012-10-19 21:21:42
【问题描述】:

我想知道如何确定 java 分配的内存。我有一个内存要求有限的程序。当我分配一个特定大小的数组时,我注意到 JVM 分配的内存是这个大小的两倍:

例如:在我分配一个数组之前:

runtime.totalMemory() 15 MB
runtime.freeMemory(): 14 MB

在这一行之后:char [] xxx = new char[4 * 1024 * 1024];

runtime.totalMemory() 15 MB
runtime.freeMemory(): 6 MB

因此,可用内存量从 14 MB 下降到 6 MB。即使我的阵列只有 4 MB。我尝试过不同的东西数组,它总是一样的。 java为什么要分配两倍的数组大小?

谢谢

【问题讨论】:

  • 请记住,char 是 16 位,因此 400 万 chars 是 8 MB,而不是 4 MB。

标签: java memory-management


【解决方案1】:

一个 char 是 16 位的,不是 8。有关详细信息,请参阅 here

char:char 数据类型是单个 16 位 Unicode 字符。它有 最小值“\u0000”(或 0)和最大值“\uffff”(或 65,535(含)。

所以你正在分配1024 * 1024 * 4 * 2(2 字节 = 16 位)。我觉得还可以。

【讨论】:

  • 感谢大家的反馈。但是,如果我从文件中逐字节读取并将每个字节转换为字符,我可以使用单个字节而不是两个字节来取回字符..?
【解决方案2】:

在 Java 中,一个字符表示为 2 个字节的 unicode。

【讨论】:

  • 您的意思是“表示为 UTF-16”。 Unicode 是字符集,而不是字符编码。从技术上讲,一些 Unicode 字符在 UTF-16 中表示为 4 个字节。
  • @ChristofferHammarström 虽然这句话在 1995 年正确的。
  • @MarkoTopolnik:不,那时候Unicode也是一个字符集,不是字符编码,那么正确的说法应该是“表示为UCS-2”。
  • @ChristofferHammarström 在口语中,将 Unicode 1.0 称为 2 字节 文本编码 是完全常见的。甚至没有人知道 UCS-2 这个词。不过没关系,反正这是历史。
  • @MarkoTopolnik:来自unicode.org/faq/basic_q.html#14:“UCS-2 是过时的术语,指的是 Unicode 1.1 之前的 Unicode 实现” - 但我同意将 Unicode 视为 2 字节是很常见的文本编码。
【解决方案3】:

sizeof(char) 对于 Java 是 2 个字节,因此 400 万个元素的 char 数组替换了 8 mibibytes,这似乎是您从 freeMemory 中丢失的确切数量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-01
    • 1970-01-01
    • 2019-03-08
    • 2011-12-02
    • 2015-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多