为什么不分配堆内存缩小时使用率低于MaxHeapFreeRatio?(Why isn't t

2019-09-21 18:32发布

我有一个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

Answer 1:

有可能会导致MaxHeapFreeRatio不兑现显然是多种因素:

  • 最小堆大小( -Xms )覆盖此(AFAIK)。
  • 的-XX:ParallelGC开关抑制堆收缩- https://forums.oracle.com/forums/thread.jspa?messageID=6438432
  • 收缩只是一个完整的GC后会发生- https://forums.oracle.com/forums/thread.jspa?messageID=95578​​61


Answer 2:

的存储器从操作系统的堆保留量由最小堆和最大堆,所述参数确定-Xms-Xmx java命令行上。 各种垃圾收集率和其他配置均内置到并不会影响JVM的内存多少总使用,只是它是如何安排在记忆的东西。

通常当人们架设服务器,他们的设置,将-Xms-Xmx是相同的值,以避免调整堆,并具有同时如果堆需要增加服务器运行后创建连续的内存空间的额外性能开销。 这意味着,内存从操作系统中保留的堆量将永远不会萎缩,因为垃圾收集的结果,它只是被释放给已经把新的JVM数据。



Answer 3:

在JRE 1.7,您可以使用-XX:+UseG1GC -XX:MinHeapFreeRatio=5 -XX:MaxHeapFreeRatio=15 。 但是,要获得内存收缩,你仍然需要通过调用来明确调用GC System.gc()



Answer 4:

我用组合-XX:+ UseG1GC -XX:ParallelGCThreads = 15 -XX:MinHeapFreeRatio = 30 -XX:MaxHeapFreeRatio = 70 -verbosegc -XX:+ PrintGCDetails -Dsun.rmi.dgc.client.gcInterval = 60000 -Dsun.rmi。 dgc.server.gcInterval = 100000,它救了我的系统崩溃所使用的内存变为99.8%,然后松开。

感谢:沙希德阿巴西



文章来源: Why isn't the allocated heap memory shrinking when usage is below MaxHeapFreeRatio?