为什么在完整GC期间有很多页面错误

时间:2013-04-05 18:51:29

标签: windows memory-management garbage-collection operating-system jvm

是Window 2003服务器。

我们正在进行一些性能测试,我们看到的是:

  1. 在前5个小时内,页面错误/秒非常小,如10或20

  2. 在过去1小时内,页面错误跳至500页错误/秒

  3. 在过去1小时内,我们看到了很多完整的GC。

  4. 请注意,我们有足够的内存,如64G,整个系统只使用了一半,所以不应该有很多硬页错误。

    我想知道的是,当JVM正在进行GC时,与无GC相比,是否会出现大量的软页面错误/秒?

1 个答案:

答案 0 :(得分:1)

Incremental garbage collectors将执行与mutator交错。这可能会导致两种问题:

  1. mutator可能会更改垃圾收集器已经分析过的对象(例如,更新引用)。在这种情况下,收集者需要了解变更情况,以便考虑到变化。

  2. copying collector的情况下,mutator可能想要查看收集器已移动的对象。在这种情况下,收集器需要被告知有关从移动对象读取的尝试,以便可以将mutator重定向到对象的新副本。 (使用" forwarding pointer"中存储的broken heart。)

  3. 问题(1)可以通过收集器在已完成分析的页面上放置hardware write barrier来解决。问题(2)可以通过收集器在包含已移动对象的页面上放置hardware read barrier来解决。

    当mutator遇到这些障碍时,会生成page faults,并且错误处理程序会从垃圾收集器运行相应的函数。

    (我不确定这是否是JVM垃圾收集器在Windows上的工作原理,但在增量垃圾收集期间会增加页面错误。)