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

JVM释放未使用的堆

麹耘豪
2023-03-14

我有一个Springboot应用程序,Mule作为微服务在docker容器中运行。即使空闲时也需要大约700MB。注意到JVM分配了380 MB的堆,这是使用-Xmx参数提供的最大堆。虽然分配了最大堆,但微服务在空闲时只使用大约50 MB。问题是如何从JVM释放未使用的内存。

似乎减少MaxHeapFreeRatio我们可以要求JVM在有更多可用内存时收缩。然而MinHeapFreeRatio=20-XX: MaxHeapFreeRatio=40没有太大区别,JVM也没有释放内存。但是当我使用带有上述两个参数的-Xmn时,JVM会按预期释放堆内存。参见下图示例场景。

-Xmn100M  -XX:+PrintGCDetails  -XX:MinHeapFreeRatio=20 -XX:MaxHeapFreeRatio=40 -Xmx384M

  1. 为什么MinHeapFreeRatio和MaxHeapFreeRatio没有按预期工作
  2. 如果上述参数良好,Xmn的后果是什么?它的值应该是多少
  3. 为了实现从JVM释放内存的任务,还有哪些其他解决方案

共有2个答案

商华藏
2023-03-14

为了实现从JVM释放内存的任务,还有哪些其他解决方案?

不确定您是否尝试过OpenJ9。它有一个调整机制来检测JVM何时空闲并将空闲内存返回页面释放到操作系统。本文讨论空闲调整功能。

您可以从OpenJDK获得OpenJDK-OpenJ9二进制文件。

如果您坚持使用OpenJDK热点组合,您可以尝试探索ShrinkHeapInSteps选项,该选项预计会大幅收缩堆,但我不确定它适用于哪些GC策略。

汝宏伯
2023-03-14

首先,这真的应该是一个评论,但它可能会变得很大。如果您真的想将内存从JVM释放回操作系统,请扪心自问。收回它会很昂贵,比如可能比按原样运行应用程序更昂贵——这会减慢你的速度。

然后,你在java-8下的默认收集器是并行GC,我不太确定那些MinHeapFreeRatioMaxHeapFreeRatio是否真的可以使用它。我已经尝试过G1GC-它确实可以,但没有使用并行。然后添加-Xmn可能只是运气/好时机;AFAIK它不应该影响其他两个参数。这是对您遇到的类似问题的一个相当有趣的答案。

 类似资料:
  • 我是分析Java记忆问题的新手。所以请原谅我这个问题看起来很天真 我在运行应用程序时设置了以下JVM参数: 我正在使用visualVM监控使用情况:以下是我看到的 问题是,即使应用程序没有接收任何要处理的数据,使用的内存也不会下降。当应用程序启动时,使用的空间开始变小(大约1GB),但随着应用程序的运行而增加。然后用过的记忆永远不会消失。我的问题是,为什么即使应用程序中没有发生重大处理,使用的堆内

  • 问题内容: 我正在使用以下功能下载小于20MB的文件。它将全部内容读取到内存中,因为另一个功能必须先对字节执行工作,然后才能将其写入磁盘。 这可以正常工作,但是所有内存都在系统上消耗了。 是否可以在其他功能处理完之后释放使用的内存,以使内存使用量不会大于当前正在处理的字节数? 问题答案: 您可能会触发gc使用释放未使用的对象,并且可能敦促Go运行时使用释放内存到OS ,但是所有这些都只是在扑救。编

  • 我改进了代码,以便从垃圾收集器中获得更好的结果。 现在,当我调用时,它确实释放了所有内存。但是,当我在不调用 的情况下观察内存使用情况时,应用程序确实会保留并使用越来越多的内存。 这是否意味着我的改进正在起作用,我的所有引用都是正确的,我可以忽略JVM是如何自己释放内存的。或者,我的代码中是否存在其他问题,这些问题是JVM在不运行垃圾收集器的情况下保留更多内存的原因。

  • 预备条件: Off-By-One 漏洞(基于栈) VM 配置:Fedora 20(x86) 继续使用已经被释放的堆内存指针叫做释放后使用。这个漏洞会导致任意代码执行。 漏洞代码: 编译命令: $gcc -o vuln vuln.c $sudo chown root vuln $sudo chgrp root vuln $sudo chmod +s vuln 注意:不像上一篇文章,ASLR 在这里是

  • 我有一个问题,我的GPU内存是没有释放后关闭在Python中的tenstorflow会话。这三行足以导致问题: 在第三行之后,内存不会被释放。我在很多论坛上走来走去,尝试了各种各样的建议,但都没有效果。有关详细信息,请参见下面我的评论: https://github.com/tensorflow/tensorflow/issues/19731 在这里,我已经记录了我设法杀死进程并释放内存的方法,但

  • 我正在使用spring rest模板发送与apache http client 4.2.1集成的rest请求。 由于需要向多个服务器发送请求,增加了PoolingClientConnectionManager来管理连接。 当系统运行几天后,我们发现连接达到了最大每路由设置。 打印日志如下所示保持活动的总数:0;分配路线:5选5;分配总数:100个中的5个 似乎由于某种原因,连接没有被释放。但是当我