【问题标题】:Java heap memory usage increasesJava 堆内存使用量增加
【发布时间】:2014-07-11 18:27:27
【问题描述】:

我正在做一个快速实验,看看我的算法的内存性能如何。 输入约为 2 Mb,算法运行大约需要 1 秒。 我在循环中运行了 500 次,以便能够查看内存分配。

这是 jConsole 显示内存使用情况的方式:

正如您所见,在 GC 开始之前,堆内存使用量每两次增加(有点指数)(即使输入相同)。

有人知道这是否是预期的以及为什么会发生吗?是JVM做了一些优化吗?

谢谢!

【问题讨论】:

  • 您的算法似乎需要更多时间才能运行。你确定你正在运行相同数量的迭代吗?
  • @JigarJoshi 如果你在 GC 之后查看内存,你会发现没有内存泄漏(至少不是很大)
  • 我同意——不是内存泄漏的迹象。
  • 在不了解算法的情况下,您无法判断这是否是预期的。

标签: java heap-memory jconsole


【解决方案1】:

有人知道这是否是预期的以及为什么会发生吗?是JVM做了一些优化吗?

JVM 试图最小化 GC 所花费的时间。如果您使用更多内存,则不必经常进行 GC。

泄漏?

如果您在 GC 之后查看内存使用情况,那么很明显它没有内存泄漏。或者至少不是一个大的。

您必须查看 Full GC 后使用的内存以确认存在内存泄漏,我认为这些是次要收集。

【讨论】:

  • 你是对的,但是相同算法的不同迭代的相同数据集导致内存飙升看起来很可疑 +1
  • @JigarJoshi JVM 将逐步更改 GC 参数。它尽量不要太突然地改变它们,所以几何增加并不那么令人惊讶。发现它可以增加,加倍,发现它可以增加,加倍等等。
  • 谢谢彼得。这是有道理的,并且完全符合这里发生的情况。我也使用了 YourKit 并确认没有内存泄漏。只是创建了很多 HashMap 对象。顺便说一句,您能否解释(或指向我的文档)有关如何调整 GC 参数的信息?为什么“使用更多内存 => GC 更少”?
  • @N3da 您正在以特定的速率分配垃圾。比如说 400 MB/s。如果您有 400 MB 的伊甸园空间,它将每秒 GC,因为这是您填充它所需的时间。 400 MB / 400 MB/秒 = 1 秒。如果你有一个 4 GB 的堆,它会每 10 秒 GC,4000 MB / 400 MB/s = 10 s。
猜你喜欢
  • 2018-07-11
  • 2021-12-08
  • 2012-07-19
  • 1970-01-01
  • 2011-11-27
  • 1970-01-01
  • 1970-01-01
  • 2017-04-02
  • 1970-01-01
相关资源
最近更新 更多