是Window 2003服务器。
我们正在进行一些性能测试,我们看到的是:
在前5个小时内,页面错误/秒非常小,如10或20
在过去1小时内,页面错误跳至500页错误/秒
在过去1小时内,我们看到了很多完整的GC。
请注意,我们有足够的内存,如64G,整个系统只使用了一半,所以不应该有很多硬页错误。
我想知道的是,当JVM正在进行GC时,与无GC相比,是否会出现大量的软页面错误/秒?
答案 0 :(得分:1)
Incremental garbage collectors将执行与mutator交错。这可能会导致两种问题:
mutator可能会更改垃圾收集器已经分析过的对象(例如,更新引用)。在这种情况下,收集者需要了解变更情况,以便考虑到变化。
在copying collector的情况下,mutator可能想要查看收集器已移动的对象。在这种情况下,收集器需要被告知有关从移动对象读取的尝试,以便可以将mutator重定向到对象的新副本。 (使用" forwarding pointer"中存储的broken heart。)
问题(1)可以通过收集器在已完成分析的页面上放置hardware write barrier来解决。问题(2)可以通过收集器在包含已移动对象的页面上放置hardware read barrier来解决。
当mutator遇到这些障碍时,会生成page faults,并且错误处理程序会从垃圾收集器运行相应的函数。
(我不确定这是否是JVM垃圾收集器在Windows上的工作原理,但在增量垃圾收集期间会增加页面错误。)