当使用率低于MaxHeapFreeRatio时,为什么分配的堆内存不会缩小?

时间:2012-08-27 22:51:08

标签: java heap-memory

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

4 个答案:

答案 0 :(得分:8)

显然有各种因素可能导致MaxHeapFreeRatio无法兑现:

答案 1 :(得分:2)

操作系统为堆保留的内存量由min heap和max heap,java命令行中的参数-Xms-Xmx决定。各种垃圾收集器比率和其他配置都是内部的,不会影响JVM使用的总内存量,也不会影响它在内存中的排列方式。

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

答案 2 :(得分:2)

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

答案 3 :(得分:0)

我使用了组合-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%然后释放。

感谢: Shahid abbasi