5

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

堆配置:
   MinHeapFreeRatio = 40
   MaxHeapFreeRatio = 70
   MaxHeapSize = 3221225472 (3072.0MB)

   新大小 = 268435456 (256.0MB)
   MaxNewSize = 268435456 (256.0MB)
   OldSize = 805306368 (768.0MB)
   新比率 = 7
   幸存者比率 = 8
   PermSize = 21757952 (20.75MB)
   MaxPermSize = 176160768 (168.0MB)

堆使用:
新一代(伊甸园 + 1 个幸存者空间):
   容量 = 241631232 (230.4375MB)
   使用 = 71657320 (68.3377456665039MB)
   免费 = 169973912 (162.0997543334961MB)
   29.65565312351675% 已使用
伊甸空间:
   容量 = 214827008 (204.875MB)
   使用 = 47322984 (45.130714416503906MB)
   免费 = 167504024 (159.7442855834961MB)
   22.028414602320392% 已使用
从太空:
   容量 = 26804224 (25.5625MB)
   使用 = 24334336 (23.20703125MB)
   免费 = 2469888 (2.35546875MB)
   90.78545232273838% 已使用
到太空:
   容量 = 26804224 (25.5625MB)
   使用 = 0 (0.0MB)
   免费 = 26804224 (25.5625MB)
   0.0% 已使用
并发标记扫描生成:
   容量 = 2952790016 (2816.0MB)
   使用 = 66930392 (63.829795837402344MB)
   免费 = 2885859624 (2752.1702041625977MB)
   2.2666830908168447% 已使用
烫发一代:
   容量 = 45752320 (43.6328125MB)
   使用 = 27404664 (26.13512420654297MB)
   免费 = 18347656 (17.49768829345703MB)
   59.89786747426142% 已使用
4

4 回答 4

9

显然有多种因素会导致 MaxHeapFreeRatio 无法兑现:

于 2012-08-27T23:58:46.107 回答
2

从操作系统为堆保留的内存量由 min heap 和 max heap、参数-Xms-Xmxjava 命令行决定。各种垃圾收集器比率和其他配置都是内部的,不会影响 JVM 使用的总内存量,只是它如何安排内存中的东西。

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

于 2012-08-27T23:13:03.463 回答
2

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

于 2015-09-29T19:32:59.103 回答
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% 然后释放。

谢谢:沙希德·阿巴西

于 2016-03-26T12:31:54.330 回答