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

为什么当使用率低于最大堆自由比时,分配的堆内存不会收缩?

方祺
2023-03-14

我有一个占用内存的java服务器任务。首先,我怀疑它是否超过了MinHeapFreeRatio,但这只是猜测。更有趣的是,GC将成熟代减少到大约2%,但从未减少为堆分配的内存。

Heap Configuration:
   MinHeapFreeRatio = 40
   MaxHeapFreeRatio = 70
   MaxHeapSize      = 3221225472 (3072.0MB)

   NewSize          = 268435456 (256.0MB)
   MaxNewSize       = 268435456 (256.0MB)
   OldSize          = 805306368 (768.0MB)
   NewRatio         = 7
   SurvivorRatio    = 8
   PermSize         = 21757952 (20.75MB)
   MaxPermSize      = 176160768 (168.0MB)

Heap Usage:
New Generation (Eden + 1 Survivor Space):
   capacity = 241631232 (230.4375MB)
   used     = 71657320 (68.3377456665039MB)
   free     = 169973912 (162.0997543334961MB)
   29.65565312351675% used
Eden Space:
   capacity = 214827008 (204.875MB)
   used     = 47322984 (45.130714416503906MB)
   free     = 167504024 (159.7442855834961MB)
   22.028414602320392% used
From Space:
   capacity = 26804224 (25.5625MB)
   used     = 24334336 (23.20703125MB)
   free     = 2469888 (2.35546875MB)
   90.78545232273838% used
To Space:
   capacity = 26804224 (25.5625MB)
   used     = 0 (0.0MB)
   free     = 26804224 (25.5625MB)
   0.0% used
concurrent mark-sweep generation:
   capacity = 2952790016 (2816.0MB)
   used     = 66930392 (63.829795837402344MB)
   free     = 2885859624 (2752.1702041625977MB)
   2.2666830908168447% used
Perm Generation:
   capacity = 45752320 (43.6328125MB)
   used     = 27404664 (26.13512420654297MB)
   free     = 18347656 (17.49768829345703MB)
   59.89786747426142% used

共有3个答案

呼延渝
2023-03-14

在JRE 1.7中,您可以使用-XX: UseG1GC-XX: MinHeapFreeRatio=5-XX: MaxHeapFreeRatio=15。但是,要缩小内存,您仍然需要通过调用System.gc()显式调用GC。

毋城
2023-03-14

操作系统为堆保留的内存量由最小堆和最大堆、java 命令行上的参数 -Xms-Xmx 确定。各种垃圾回收器比率和其他配置都是内部的,不会影响JVM使用的总内存量,而不会影响它如何在该内存中排列内容。

通常,当人们设置服务器时,他们会将< code>-Xms和< code>-Xmx设置为相同的值,以避免在堆需要增长时调整堆的大小和在服务器运行时创建连续内存空间的额外性能成本。这意味着操作系统为堆保留的内存量永远不会因为垃圾收集而减少,它只是被释放出来以容纳新的JVM数据。

帅彦
2023-03-14

显然,有各种因素可能导致最大堆自由Ratio不被尊重:

  • 最小堆大小(-Xms)将覆盖此(AFAIK)
  • -XX:ParallelGC开关禁止堆收缩-https://forums.oracle.com/forums/thread.jspa?messageID=6438432
  • 收缩只发生在完全GC-https://forums.oracle.com/forums/thread.jspa?messageID=9557861
 类似资料:
  • 我的java actvemq进程的配置如下,其中Xmx为15360M,但当我使用glance查看进程内存使用情况时,我看到RSS 41.8gb和VSS 51.6gb。pmap | grep total给了我总计54059348K。我不确定activemq中发生了什么,导致占用了这么多内存。而堆使用率很低,只有60%。 在pmap的输出中,我看到了许多anon块。请查看随附的PMAP输出 请在此处找

  • 问题内容: 我只是在一本Java书中读到这句话,说Java中的对象驻留在堆上。使用堆是因为它是快速存储数据和快速检索数据的最佳方法吗? 我只有一个关于数据结构初学者的想法。我的意思是为什么不堆叠或其他? 问题答案: 堆栈的问题是您只能删除最近添加的内容。这对于局部变量非常有效,因为它们在您进入和退出函数时会来来去去,但对于生命周期不遵循单个函数的任意数据而言,效果则不太好。内存堆使您可以随意添加和

  • 我一直想知道为什么STL优先级队列默认使用最大堆而不是最小堆。我想到的两个明显的用例是寻路(Dijkstra)和构建霍夫曼代码。这两种算法都需要首先拉取最小元素。由于排序(std::sort)默认使用升序,我想知道priority_queue背后的设计原因是什么,因为我非常喜欢默认的最小堆。

  • 我们将和设置为1536m。现在,如果我理解正确的话,j-xmx表示堆的最大大小。 本系统采用4核15GB ram进程。 但是,当我检查正在运行的Java进程的RSS(使用top)时,我看到它使用的值比大,大约。 对于来说,有4个内核和15GB RAM的理想设置是什么(假设除了Java应用程序之外,系统中没有其他进程在运行)

  • 我试图寻找这个问题的答案,但始终没有找到答案。 当我定义最大堆大小时,为Java GC空间分配大小的标准比率是多少? 也就是说:如果我用4Gb的堆启动JVM,那么分配给Eden的是多少?给幸存者多少钱?终身监禁要多少钱? 此外,对于不同的VM供应商,该比率是否会发生变化? 提前谢谢

  • 问题内容: 是局部变量,将其存储在堆或堆栈中的何处? 问题答案: 在堆上。每当您用来创建对象时,它都会在堆上分配。