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

JVM不会像我说的那样使用那么多内存

高慈
2023-03-14

我正在运行一个内存密集型应用程序。一些关于环境的信息:

  • 64位debian
  • 13 GB RAM
  • 64位JVM(我的程序运行时输出System.getProperty("sun.arch.data.model"),它说"64")

下面是我发出的确切命令:

Java-xmx 9000m-jar " ale . jar " test config

我已经用同样精确的数据、配置等运行了程序。在其他几个系统上,我知道JVM在这些系统上使用(在其峰值)6 GB内存。然而,我得到了一个内存不足的错误。此外,在程序执行期间,系统的空闲内存从未低于8.5 GB。

当我输出Runtime.getRuntime()时。maxMemory()在执行期间,我得到值3044540416,即~3 GB。

我不知道这是否相关,但这是一个谷歌计算引擎实例。

我能想到的唯一解释是,对于单个进程可以使用的最大内存量,可能存在某种系统限制。

共有2个答案

佘缪文
2023-03-14

我能想到的唯一解释是,对于单个进程可以使用的最大内存量,可能存在某种系统限制。

这是一种可能的解释。

另一个原因是您试图分配一个非常大的数组。最大的可能数组是2^31 - 1元素,但实际大小取决于元素大小:

  • byte[]boolean[]...2G字节
  • char[]短[]...4G字节
  • int[]...8 Gbytes
  • long[]Object[]...16 Gbytes

如果您分配了一个非常大的数组,GC需要找到所需大小的连续空闲内存区域。根据数组大小以及堆空间如何划分为多个空间,它可能会找到比您想象的少得多的连续空间。

第三种可能性是,您获得 OOME 是因为 GC 已达到运行 GC 所花费时间的 GC 开销限制。

如果您向我们展示堆栈跟踪,则可以确认或驳回其中一些理论......

雍志文
2023-03-14

-Xmx将只设置分配的最大内存。使用-Xms指定最小值。将它们设置为相同的值将使内存占用保持静态。

 类似资料:
  • 你好,亲爱的StackOverflow社区,我最近遇到了一个问题,我不能把一个已经保存的对象的引用放进去。我不想保存或更新对象,因为这些对象是预先插入到我们的数据库中的。 所以基本上我的情况是这样的:我有一个父,在本例中它是一个摄取,对象有一个IntakeTimes列表,它们被声明为remainingdoses。有道理,嗯。 我的模型看起来如下: 我期待着任何帮助或提示,谢谢社区。

  • 问题内容: 我有以下状态: 然后我更新状态: 由于setState是假设要合并的,所以我希望它是: 但是它吃掉了id,状态为: 这是预期的行为吗?仅更新嵌套状态对象的一个​​属性的解决方案是什么? 问题答案: 我认为不做递归合并。 您可以使用当前状态的值构造一个新状态,然后调用该状态: 我在这里使用过函数function(来自underscore.js库),通过创建状态的浅表副本来防止对该状态的现

  • 我想使用查找从一个集合中获取一些数据并将其放入另一个集合中。 在localfield或foreignfield中写什么都不重要,因为它从player_game_stats中获取所有数据并将其插入player集合中的每个文档中。我想检查localfield和foreignField是否相等,但lookup不检查这一点。我对mongodb使用NoSqlBooster

  • 问题内容: 我正在尝试在C#程序中测量内存使用情况。 我想知道这个Java函数的C#等效项: 代表为堆 分配 的总内存。我需要此信息来了解为我的C#程序分配的内存总大小。 然后在Java中,我可以通过以下方式获得使用的内存: 目前,我在C#中使用它来获取已使用的内存: 但是我不能完全确定是否等同。 因此,在简历中,如何在时间 t 获得C#应用程序的总分配空间以及当前使用空间? 编辑: 从答案和进一

  • 无法更改字体的颜色 正如您所看到的,文本“Weiter”并不显示在按钮中。 下面是它的样式: 我使字体的大小,以显示,字在后面的按钮,我不能改变它的颜色。我试图通过在样式后面使用!重要来避免这种情况,但实际上这也不适合我。 HTML代码: 实际上我不知道如何将它带入工作片段。希望还能有帮助