我在Scala中编写了一个应用程序。基本上,第一步是创建一个对象数组,然后从csv文件初始化这些对象。当在jvm上运行应用程序时,它确实很慢,经过一些实验后我发现使用-J-Xincgc标志可以增加垃圾收集速度,使应用速度提高4倍(开关速度提高了4倍! )。我想知道:
1)为什么? 2)我是否有一些无效的编码,如果是的话,我应该从哪里开始了解最新情况?
谢谢!
答案 0 :(得分:1)
我假设您在热点上运行此功能。
热点JVM有一个whole zoo of garbage collectors,其中大多数也可能有某种子模式或各种命令行开关,这些开关会显着改变它们的行为。 默认情况下使用哪个GC因JVM版本,操作系统和32/64位VM而异。 因此,您基本上将默认值更改为特定算法,该算法恰好执行了更快的"为你的工作量。
但是"更快"是一个模糊的措施。如果考虑多线程,挂起时间与花费的CPU周期不同。而且一些收藏家可能只是选择更积极地增加堆积,从而将收集成本推迟到以后的某个时间点,如果你的程序运行时间不长,你可能没有测量过。
要进行准确的评估,需要更多信息
Oracle's GC tuning指南可能对您有用
在您的情况下,-Xincgc
以增量模式转换为CMS,该模式适用于单核环境,自java8起已弃用。它可能恰好比默认值好,但它不一定是最佳选择。
答案 1 :(得分:1)
如果遇到接近堆大小限制的情况,可能会浪费大量GC时间,这可能导致大量关于性能的错误发现。如果这是你的情况,首先要增加你的堆大小限制,然后再做其他事情。考虑使用jvisualvm来观察情况 - 它很容易上手。