我正在使用 Infinispan 缓存来存储值。代码每 10 分钟写入一次缓存,缓存达到大约 400mb 的大小。它有大约 2 小时的生存时间,最大条目为 1600 万,尽管目前在我的测试中条目数量不超过 200 万左右(我可以通过检查 jconsole 中的 mbeans/metrics 看到这一点) .
当我启动 jboss 时,java 堆大小是 1.5Gb 到 2Gb。分配给 jboss 的最大内存的 -Xmx 设置为 4Gb。
当我禁用 Infinispan 缓存时,堆内存使用量保持在 1.5Gb 到 2Gb 左右。它非常稳定并保持在那个水平。
=> 问题是:当我启用Infinispan 缓存时,java 堆大小增长到大约 3.5Gb/4Gb,这超出了预期。我做了一个堆转储来检查 Eclipse MAT 中缓存的大小,它只有 300 或 400mb(没关系)。所以我希望内存使用量达到 2.5Gb 并保持稳定在这个水平,因为初始堆大小是 2Gb,最大缓存大小应该只有 500mb 左右。
然而,它会随着时间的推移继续增长和增长。每 2 或 3 小时完成一次垃圾收集,这将使用量降低到大约 1 或 1.5Gb,但随后在 30 分钟内再次增加到 3.5Gb。条目数稳定在大约 200 万个,因此这不仅仅是因为更多条目进入缓存。(此外,驱逐次数保持为 0)。
如果缓存只有 400-500 mb,那么什么可以保留这么大的内存?我的垃圾收集设置有问题吗?还是我应该查看 Infinispan 设置?
谢谢!
编辑:您可以在此处查看随时间变化的堆大小。奇怪的是,即使在看起来像完整的 GC 之后,内存也会再次回升到 3Gb。这对应于进入缓存的更多条目。

编辑:事实证明这与 …