1

它是Window 2003服务器。为什么在完整GC期间有很多页面错误

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

  1. 在最初5小时,缺页/秒是非常小的,像10或20

  2. 在最后1小时后,页面错误跳转到500页面错误/秒

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

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

我想知道的是,当JVM做GC,是期望看到相比,没有GC软页面错误/秒的大量?

回答

1

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

  1. mutator可能会更改垃圾回收器已经分析过的对象(例如,更新引用)。在这种情况下,收集者需要被告知有关更改,以便它可以考虑更改。

  2. copying collector的情况下,增变器可能想看看在该集电极已移动的对象。在这种情况下,需要向收集器通知从移动对象读取的尝试,以便可以将该增变器重定向到对象的新副本。 (使用存储在“broken heart”的forwarding pointer。)

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

当增变击中这些障碍,page faults产生,并且在故障处理程序运行从垃圾收集器的合适的函数。

(我不知道,如果是这样的JVM垃圾收集器是如何工作的Windows版本,但页面故障的增加是递增式垃圾收集过程中的预期。)

+0

我不认为最垃圾大多数平台上的收藏家实际上使用这样的技巧,尽管我听说过一些更奇特的做法(例如阿祖尔的一种)。仍然,非常好的解释! +1 – delnan 2013-04-05 20:11:07

+0

你可能会惊讶:例如,[伯姆集电极(http://en.wikipedia.org/wiki/Boehm_garbage_collector)使用写障碍(这是一个非移动的收集,因此不需要阅读屏障)它用于GCJ和Mono等项目。 – 2013-04-05 20:14:08

+0

是的,但是我们正在讨论硬件障碍。我的印象是,在完全控制生成代码的实现中(即不是Boehm,而是GCJ,Mono,.NET,JVM,LuaJIT等,以及具有复杂GC的解释器),它是一种软件而不是硬件事情:添加到触摸引用的每段代码中的一些指令。 – delnan 2013-04-05 21:07:27

相关问题