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

为什么Java可以分配比指定堆大小更多的内存

宓跃
2023-03-14

我们将-j-xmx1536-j-xms1536m设置为1536m。现在,如果我理解正确的话,j-xmx表示堆的最大大小。

本系统采用4核15GB ram进程。

但是,当我检查正在运行的Java进程的RSS(使用top)时,我看到它使用的值比-jxmx1536大,大约~2GB

对于-jxmx来说,有4个内核和15GB RAM的理想设置是什么(假设除了Java应用程序之外,系统中没有其他进程在运行)

共有1个答案

百里芷阳
2023-03-14

为什么?我没有看到任何Java内存不足的异常。

因为没有用完堆内存,所以启动VisualVM并在设置-xmx后检查进程。您将注意到有一个称为MetaSpace的区域(默认情况下最大1G),此外,进程还可以使用额外的内存,例如,用于代码缓存(JIT-ed本机代码)

对于具有4个内核和15GB RAM的JXMX来说,理想的设置是什么(假设除了Java应用程序之外,系统中没有其他进程在运行)

 类似资料:
  • 我从这里了解到,std::initializer\u list不需要分配堆内存。这对我来说很奇怪,因为您可以在不指定大小的情况下接受std::initializer\u list对象,而对于数组,您总是需要指定大小。尽管初始值设定项在内部的列表与数组几乎相同(正如帖子所建议的)。 我很难理解的是,使用C作为静态类型语言,每个对象的内存布局(和大小)必须在编译时固定。因此,每个std::array都

  • 问题内容: 我们正试图在我们的Web应用程序中找到导致大量内存泄漏的元凶。我们在发现内存泄漏方面经验有限,但是我们发现了如何使用Eclipse MAT进行Java堆转储并对其进行分析。 但是,对于我们使用56 / 60GB内存的应用程序,堆转储的大小仅为16GB,而在Eclipse MAT中则更少。 语境 我们的服务器将Ubuntu 14.04上的Wildfly 8.2.0用于我们的Java应用程

  • 我们正试图找到web应用程序中大内存泄漏的罪魁祸首。我们在查找内存泄漏方面的经验相当有限,但我们了解了如何使用创建java堆转储,并在Eclipse mat中对其进行分析。 但是,由于我们的应用程序使用56/60GB内存,堆转储的大小只有16GB,在Eclipse mat中就更少了。 对于我们的java应用程序,我们的服务器使用Ubuntu14.04上的Wildfly8.2.0,其进程使用了95%

  • 我一直在分析我们服务的Java.lang.OutofMemoryError:Java堆空间,并试图通过Eclipse MAT工具挖掘堆转储。 我们的服务使用8G堆运行,生成的堆转储的大小只有500 MB。

  • 问题内容: 这是 不是 增加Java的堆的最大尺寸的虚拟机启动后。技术原因是什么?垃圾回收算法是否取决于要使用固定数量的内存?还是出于安全原因,通过消耗所有可用内存来防止Java应用程序从DOS的系统中移至其他应用程序? 问题答案: 最后我知道在Sun的JVM中,必须在连续的地址空间中分配整个堆。我想对于大堆值,很难在启动后将其添加到您的地址空间中,同时又要确保它保持连续。您可能需要在启动时获取它

  • 我们在日志中看到了OutOfMemoryExceptions,它们似乎与java堆提交大小从~1G增长到~2.4G一致。尽管有错误消息,但堆空间似乎没有用完。除了抛出异常(和生成的堆转储)之外,调整大小似乎最终会成功,应用程序继续运行,没有任何问题(堆提交大小约2.4G)。 下面是日志输出的一个示例: 请注意,在OOME之前,提交的堆总数在1GB和2.4GB之间振荡。我们可以看到,它之前非常稳定在