代码之家  ›  专栏  ›  技术社区  ›  Andreas Petersson

健康的垃圾收集指标?

  •  3
  • Andreas Petersson  · 技术社区  · 17 年前

    我分析了一个jdbc/hibernate批处理导入器。它接受一个csv,将其转换为slightly,并将其导入本地主机上的数据库。

    令我惊讶的是,该操作并没有受到I/O的限制,而是受到cpu的限制。

    根据jmx/jconsole和netbeans探查器,60%的cpu时间都花在了“old-gen”垃圾收集器上 其余部分用于几何转换(这是合理的)和hibernate会话管理。

    根据jconsole的数据,其他应用程序的使用率约为5-10% 那么,对于这样的批插入任务,cpu/young GC/old GC的“典型”比率是多少?

    4 回复  |  直到 17 年前
        1
  •  1
  •   Charlie Martin    17 年前

    您可能希望对跑步进行更详细的配置。

        2
  •  1
  •   Neil Coffey    17 年前

    除了Charlie所说的之外,我认为另一个可能导致这种情况的原因是,如果您有很多带有终结器的对象(一些库顽皮地这样做)——正如我所记得的,这实际上迫使它们绕过VM的快速对象释放路径。

        3
  •  1
  •   Andreas Petersson    17 年前

    再看一眼netbeans profiler/heap walker,就可以清楚地看到,有大量的字符串实例包含完整的sql语句。这是由log4jdbc引起的。 查理·马丁斯的猜测部分正确。

    log4jdbc未配置为登录到任何appender,但其日志级别仍设置为INFO。尽管日志文件不包含任何sql信息,但它仍然在后台呈现。

    没有log4jdbc带来的性能提升是巨大的。

    数据库cpu利用率从1-2%上升到20-50%(一个核心已充分利用) 在不记录日志的情况下,现在大约1-2秒内插入5000个条目。

    GC时间为>20%清楚地表明出了问题。

        4
  •  0
  •   ReneS    17 年前

    我同意,对于GC时间,高达10%通常是可以的。如果您有旧的gen问题,请尝试添加- XX:新闻化