当前位置: 首页 > 知识库问答 >
问题:

主内存很多 JVM 需要分配字符数组吗?

龚志
2023-03-14

考虑以下单线程序:

public static void main(String[] args) throws Exception {
    // 134217728 * 2 bytes / 1024 / 1024 = 256M
    char[] array = new char[134217728]; 
}

JVM需要多少内存来分配这个256M字符数组?

原来答案是-Xmx384m。现在让我们尝试512M字符数组...

// 268435456 * 2 bytes / 1024 / 1024 = 512M
char[] array = new char[268435456]; 

答案似乎是-Xmx769m。

在运行一些大小为m的字符数组的示例。jvm 至少需要 1.5m 兆字节的内存来分配阵列。这似乎很多,谁能解释一下这里发生了什么?

共有2个答案

杨慎之
2023-03-14

环境本身需要一点空间,就像在一个注释中一样,它取决于所使用的JVM和编译器(OpenJdk或Oracle,java 6 / 7 / 8)。总而言之,它应该以大小为导向:字符大小 * 数组长度。

彭风华
2023-03-14

我相信您正在观察甲骨文JVM分配内存的方式。

特别是,整个数组必须适合一个“世代”。默认情况下,旧世代的大小是新世代的两倍——这意味着您总共每添加3MB,旧世代只能获得2MB的额外空间。如果您更改比例,您可以以更小的总大小分配char数组。例如,这对我来说适用于您的512MB数组:

java -Xmx530M -XX:NewRatio=50 Test

顺便说一句,您会看到与字节数组完全相同的效果,然后您不必担心将数组的长度加倍以获得以字节为单位的大小。(类引用和长度有很小的常量开销,但显然这是微不足道的。

 类似资料:
  • 我读过很多关于创建字符串时内存分配的相互矛盾的文章。一些文章说new operator在堆中创建一个字符串,String literal在String Pool[heap]中创建,而一些文章说new operator在堆中创建一个对象,在String Pool中创建另一个对象。 为了分析这一点,我写了下面的程序,打印字符串字符数组和字符串对象的hashcode: 此程序打印以下输出: 从这个输出中

  • 我的问题是,谁分配和管理这些内存段?操作系统不知道java程序正在运行,并认为它是JVM的一部分,作为计算机上的常规程序运行,JIT编译、java堆栈的使用,这些操作需要运行时内存分配,我不明白的是JVM如何将其内存划分为这些内存段。这肯定不是由操作系统来完成的,这些内存段(例如java堆栈)必须是连续的才能工作,所以如果JVM程序只是使用malloc命令来接收堆内存的最大大小并将这些内存划分为多

  • 我有一个非常消耗内存的程序,想使用-Xmx2048m为java jvm分配更多的最大内存。但在启动时,我得到一个“无法为对象堆保留足够的空间”错误。 当尝试多个值并发现我的最大值是时,它就开始了。但我喜欢分配2GB。在使用-Xmx1560m启动java进程后,我有6GB的物理内存,Taskmanager显示3400MB可用。 有人知道我为什么不能分配2GB吗?

  • 对此有什么建议吗?

  • 有人能给我解释一下上面这一行的记忆地图吗。它将有多少个对象和引用?

  • 问题内容: 例如,如果我有一个带有两种情况的枚举,它是否比布尔值占用更多的内存?语言:Java,C ++ 问题答案: 在Java中,an 是成熟的类: Java编程语言的枚举类型比其他语言的枚举类型更强大。枚举声明定义了一个类(称为枚举类型)。枚举类主体可以包括方法和其他字段。 为了查看每个文件的实际大小,让我们做一个实际的文件并检查它创建的文件的内容。 假设我们有以下枚举类: 编译以上内容并反汇