2014-07-11 52 views
1

我正在做一个快速实验,看看我的算法的内存性能如何。 输入约为2 Mb,算法运行约需1秒。 我运行这个循环500次,以便能够查看内存分配。Java堆内存使用增加

这是JConsole的是如何显示内存使用情况:

enter image description here

正如你可以看到堆内存使用量的增加(有点呈指数级)每两次GC开始之前(即使输入是一样的)。

有没有人知道这是否是预期的,为什么会发生?这是由JVM完成的一些优化吗?

谢谢!

+0

阅读http://docs.oracle.com/cd/E19900-01/819-4742/abeik/index.html – user1071777

+0

它看起来像你的算法需要更多的时间来运行。你确定你正在运行相同数量的迭代吗? – JohnnyAW

+1

@JigarJoshi如果你看一下GC之后的内存,你可以看到没有内存泄漏(至少不是一个大的内存泄漏) –

回答

3

有谁知道这是否是预期的,为什么会发生?这是由JVM完成的一些优化吗?

JVM正在尝试将花费的时间降到最低。如果你使用更多的内存,它不需要经常使用GC。

泄漏?

如果你看一下GC之后的内存使用情况,它很明显是相同的,所以它没有内存泄漏。或者至少不是一个大的。

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

+0

你是对的,但是在同一算法的不同迭代中设置的相同数据会导致内存突然出现可疑+1 –

+0

@JigarJoshi JVM将逐步改变GC参数。它试图不改变它们太突然,所以几何增加并不令人惊讶。发现它可以增加,双打它,发现它可以增加,双打等。 –

+0

谢谢彼得。这是有道理的,完全符合这里发生的事情。我也使用YourKit并确认没有内存泄漏。只是很多HashMap对象被创建。 顺便说一句,你可以解释(或指向我的文档)如何调整GC参数?为什么“使用更多内存=> GC不经常”? – N3da