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

Java中的内存分配增加了一倍

梁宏才
2023-03-14

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

例如:在分配数组之前:

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

此行后:char[]xxx=新char[4*1024*1024];

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

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

谢谢

共有3个答案

伍弘盛
2023-03-14

在Java中,字符表示为unicode,即2个字节

伍耀
2023-03-14

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

衡安晏
2023-03-14

字符是16位,而不是8位。有关更多详细信息,请参见此处。

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

所以你正在分配1024 * 1024 * 4 * 2(2字节=16位)。在我看来没问题。

 类似资料:
  • 我使用“mvn exec:java”运行我的程序: 我没有找到更改JVM的最大内存分配。 我试过-Dexec.commandlineArgs="..."但那不起作用...

  • 我有一个一直在思考的问题。以这个特殊的类为例 假设我有一个B类,它拥有一个使用listOne读取详细信息的方法。要查看数组列表,我需要首先获取列表的大小,以便我的代码知道数组列表何时结束。有两种方法可以做到这一点,一种是 或者我也可以用 在内存和效率方面,哪种方法更好?此外,假设我正在递归地读取一个非常大的数组。为了简单起见,让我们假设递归读取此数组将导致堆栈溢出异常。在这种情况下,第一个方法在理

  • 问题内容: 类B继承了类A。现在,当我们创建类型B的对象时,为B分配的内存是多少?是否包括A和B或任何其他内存分配过程? 问题答案: 当创建对象B时,假设调用了默认构造函数 然后,JVM分配具有更多或更少内容的对象: 在B中显式声明的每个字段都有足够的内存(每个字段通常大约4-8字节,但是类型和主机系统之间有很大差异) 对于A及其祖先继承的每个最终字段,都有足够的内存 足够的内存来包含对调度向量的

  • 我有一个关于java如何处理未使用变量的问题。 假设我有以下代码: 那么我就不会在代码中使用notUsedVariable。该变量是否会被存储,或者java是否足够聪明,可以在编译时忽略该变量? 谢谢

  • 问题内容: 嗨,我想知道我可以根据我的应用程序增加JVM的内存。如果是,如何增加JVM的内存?我怎么知道JVM的大小? 问题答案: 启动JVM时,可以调整两个参数以适合你的内存需求: 指定初始Java堆大小,并 最大Java堆大小。 http://www.rgagnon.com/javadetails/java-0131.html

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