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

减少JVM中未使用的堆大小

公良鸿光
2023-03-14

这里和这里都有类似的问题,但对JVM参数的更改都没有让我找到相同的解决方案。我只是想减少JVM未使用的堆大小,以便它更接近实际使用情况(将其释放给操作系统)。我一直在使用YourKit来分析内存使用情况,它通常如下所示:

我正在运行智能Ij IDEA社区版64位,在Windows 7 64位,8 GB RAM上运行。我已经编辑了.vmoptions文件在这里找到: C:\程序文件 (x86)\JetBrains\IntelliJ IDEA社区版 14.1.5\bin\idea64.exe.vmoptions 与上述链接中提到的建议。第一个链接的答案实际上是错误的/过时的,但是2条评论链接到这里和这里找到的文章,这些文章似乎很有希望。问题是,我已经尝试了上面提到的所有不同的垃圾回收器,但仍然看到上面显示的类似(不相同)堆大小。

如何减少分配的堆大小(橄榄绿)以更准确地反映实际使用情况(蓝色)?垃圾收集不应该降低堆大小,而不是像目前这样增加它。

我尝试按如下方式配置我的想法64.exe.vm选项:

根据上面的最后一个链接,它声称

只有串行GC和G1向操作系统释放未使用的内存

它甚至直观地显示了堆是如何减少的。然而,我没有运气,并尝试了以下所有方法:这是怎么回事??

-XX: 使用序列

-XX:-使用系列

-XX:+UseG1GC

-XX:-UseG1GC

Both of the above together, with and without ("+/-")

-XX:-UseAdaptiveSizePolicy
-XX:-UseParallelGC

-XX:使用ConcMarkSweepGC

-Xms128m
-Xmx750m
-XX:MaxPermSize=350m
-XX:ReservedCodeCacheSize=225m
-XX:+UseG1GC
-XX:SoftRefLRUPolicyMSPerMB=50
-ea
-Dsun.io.useCanonCaches=false
-Djava.net.preferIPv4Stack=true
-Djsse.enableSNIExtension=false

-server
-Xms128m
-Xmx512m
-XX:MaxPermSize=250m
-XX:ReservedCodeCacheSize=150m
-XX:UseConcMarkSweepGC
-XX:SoftRefLRUPolicyMSPerMB=50
-ea
-Dsun.io.useCanonCaches=false
-Djava.net.preferIPv4Stack=true

编辑:

为了重申为什么这不是一个副本,另一个“答案”是5年前的,甚至没有提到任何现代垃圾收集器。唯一有用的部分是注释中的两个链接,这两个链接指向要使用的不同JVM参数,所有这些我都尝试过,但没有成功。我已经完全尝试了那些解决方法,仍然没有结果。这正是为什么我敦促你考虑这是独特的,因为其他人可能正在经历同样的循环挫折。


共有1个答案

司徒高丽
2023-03-14

据我所知,这些只是为编辑本身。您应该在以下位置插入这些设置:

奔跑

如果将这些选项放在程序vmoption中,则它们应该可以工作。

 类似资料:
  • 我有一个应用程序,它使用大量的内存来区分两个潜在的巨大(100k)目录的内容。对我来说,这样的操作会占用大量内存是有道理的,但是一旦我的 diff'ing 操作完成,堆的大小就会保持不变。 我基本上有实例化类的代码,用于存储源和目标上每个文件的文件名、文件大小、路径和修改日期。我将添加、删除和更新保存在其他数组中。然后,我我的源数组和目标数组(现在可能每个都是100k),只剩下相对较小的添加、删除

  • 我有一个在 上运行的 Java 应用程序。我观察到系统报告的Java进程的RSS使用率不断增加,它将达到超过90%的物理内存,即,我的代码将重新启动系统。另一方面,我从代码中定期打印出来的表明它总是在不超过物理内存37%的有限范围内波动(意味着 你知道发生了什么以及如何解决这个问题吗? 该系统是 板上的嵌入式 Linux。

  • 我有一个Springboot应用程序,Mule作为微服务在docker容器中运行。即使空闲时也需要大约700MB。注意到JVM分配了380 MB的堆,这是使用参数提供的最大堆。虽然分配了最大堆,但微服务在空闲时只使用大约50 MB。问题是如何从JVM释放未使用的内存。 似乎减少MaxHeapFreeRatio我们可以要求JVM在有更多可用内存时收缩。然而没有太大区别,JVM也没有释放内存。但是当我

  • 问题内容: 我正在以下Java版本上运行单线程Java应用程序: 启用该选项。仍然在启动应用程序时,使用监视系统时看到多个线程正在启​​动。我想尽可能减少启动的进程数,因为我有一个用例,其中涉及运行该应用程序的多个实例,这将达到我正在运行的系统上允许的最大进程数的顶峰。上。除了可以用来减少启动线程数之外,是否还有其他jvm选项? 问题答案: 除了禁用并行或并发GC外,还有以下选项可减少JVM线程数

  • 问题内容: 当然,在32位系统中可以设置的理论最大堆值是字节,但是通常(请参阅:了解最大JVM堆大小 -32 位vs64位),一个人不能使用全部4GB。 对于在64位计算机上的64位OS中运行的64位JVM,除了理论上的字节数限制或16艾字节之外,是否还有其他限制? 我知道由于种种原因(主要是垃圾回收),过大的堆可能不是 明智的选择 ,但是鉴于阅读了有关具有terrabytes RAM的服务器的信

  • 问题内容: Java SE 6中Sun的JVM的默认最大堆大小是多少(即等效于设置-Xmx)? 貌似对Java SE 5与服务器级计算机,它的 小于物理内存的1/4或1GB。 额外的问题:对于IBM的JVM,您可以提出要求 您可以类似地询问Sun的JVM吗? 编辑 : 我使用Runtime.getRuntime()。maxMemory来确认min(物理内存/ 4,1G),这在Sun文档中已引用。