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

JVM分配的空间太大

吕鸿朗
2023-03-14

我运行了两个用nginx群集的tomcat实例。在我的tomcats上,我将Infinispan作为分布式缓存运行。当我在缓存中插入大约4mio的记录时,有些奇怪的事情发生了。在图1中你可以看出我的意思。JVM分配的内存比以往任何时候都要多,而且使用后不会释放。

JVM参数:

  • xmx8g
  • xx:newRatio=4
  • xx:survivorratio=8
  • xx:+UseCompressedoops
  • XX:+UseConcMarkSweepGC
  • XX:+USEParnewGC
  • XX:+DisableExplicitGC
  • xx:+usecmsInitiatingOccupancyOnly
  • xx:+CMSClassUnloadingEnabled
  • xx:+CMSScavengeBeForereMark
  • xx:CMSInitiatingOccupancyFraction=68
  • xx:MaxHeapFreeRatio=20
  • xx:MinHeapFreeRatio=10

你能给我解释一下为什么即使我将MAXHeapFreeRatio设置为20%,JVM也不释放已分配的内存吗?

共有1个答案

屠泰平
2023-03-14

您可以参考这篇SO帖子,看看这里注意到的问题是否适用于您,以及为什么您没有看到您的内存得到预期的释放。

TL;DR版本是这样的,人们似乎已经发现,串行GC配置是唯一一个真正关注最小/最大堆比率选项的配置,但对于您的特定情况,这可能会有所不同。

进一步的参考可能会对GC的行为有所帮助。

 类似资料:
  • 我在docker中运行的应用程序面临问题。出乎意料的是,它在30分钟后坠毁。当我的应用程序处理哪个缓存时,首先怀疑的是内存利用率。 我在应用程序启动时运行该命令,它显示元空间利用率为98%,这很奇怪。 所以我的问题是,这种利用率是否表明我的应用程序将98%的操作系统内存用于JVM进程,或者98%的操作系统内存可用于JVM?

  • 问题内容: 我正在研究真正了解JVM中内存分配的工作方式。我正在编写一个内存不足的应用程序:堆空间异常。 我知道我可以传入VM参数(例如Xms和Xmx)来增加JVM为正在运行的进程分配的堆空间。这是解决此问题的一种可能的解决方案,或者我可以检查代码是否存在内存泄漏并在那里解决问题。 我的问题是: 1)JVM如何实际为其分配内存?这与OS如何将可用内存传递给JVM有什么关系?或更一般而言,任何进程的

  • 我想真正了解内存分配在JVM中是如何工作的。我正在编写一个内存不足的应用程序:堆空间异常。 我知道我可以传入VM参数,如Xms和Xmx,以增加JVM为正在运行的进程分配的堆空间。这是一个可能的解决方案,或者我可以检查我的代码内存泄漏并修复那里的问题。 我的问题是: 1)JVM实际上如何为自己分配内存?这与OS如何将可用内存传递给JVM有什么关系?或者更一般地说,为任何进程分配内存实际上是如何工作的

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

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

  • 据我所知,对于旧一代JVM中的空间,它可以用于两个目的, 用于从年轻一代升级到老一代的物品 用于特殊用例中的新对象分配(https://stackoverflow.com/questions/9053144/will-i-encounter-java-lang-outofmemoryerror-even-with-no-lack-of-memory) 我的问题是, 在老一代中,是否还有其他利用空间