龙芯攻克OpenJDK官方遗留GC稳定性难题

发布时间:2019-09-05 fujie

  Java是龙芯软件生态的重要组成部分,是龙芯重点培育和发展的关键性基础软件。从2019年起,龙芯Java的工作思路发生了明显改变,由过去被动跟随上游社区转变为主动参与社区工作,以更加开放的姿态拥抱开源。截止到今年8月末,龙芯已累计向OpenJDK社区提交了数十个patch。
  近期,龙芯Java团队再次向OpenJDK社区提交了一个关键性patch[1],精准定位并解决了OpenJDK官方长期遗留的GC稳定性问题。该问题在龙芯高强度大规模的应用测试中被触发。经过分析,判定该问题属于OpenJDK官方遗留的GC稳定性问题。依照开源社区规则,龙芯向OpenJDK报告了该问题[2],如图1所示,并主动承担起分析和解决该问题的责任。
  Javabug1.png
  图1 龙芯向OpenJDK社区报告的GC稳定性问题
  经过两个多星期的攻关,GC稳定性问题的机理最终被探查清楚。错误点位于GC模块公共代码中,出错原因为并行GC算法在遭遇一个corner case时失效。问题的机理涉及GC算法本身、CPU访存模型、编译器优化处理和并行编程等多个复杂领域,其详细分析参见[3]。机理清晰后,龙芯拟定了修复方案,并向社区提出了code review的申请。龙芯的申请获得了官方的迅速响应,Doerr Martin,Kim Barrett和Thomas Schatzl三位专家review了龙芯的代码,如图2所示。其中,Doerr Martin为PowerPC的JVM首席架构师,Kim Barrett和Thomas Schatzl为Oracle知名GC专家。龙芯对这三位专家的帮助表示衷心感谢。
  Javabug2.png
  图2 Java社区专家review龙芯的代码
  Doerr Martin对龙芯能够发现这个问题非常惊讶。他表示,该问题由读操作被乱序导致,在弱一致性访存模型的处理器中更容易暴露。PowerPC虽然和龙芯同为弱一致性访存模型,却没能发现这个问题。他在review时特别强调,x86和sparc等拥有较强访存模型的架构也需要进行修复,因为x86等虽然能保证执行时CPU禁止读操作乱序,但却无法保证编译器在编译时不进行读操作的乱序优化。因此,包括x86在内的所有平台均需要进行修复。最后,Doerr Martin感叹解决这类问题很困难,并对龙芯能及时修复并公开patch表示感谢。
  Kim Barrett则对Doerr Martin的惊讶进行了回应。在他看来,龙芯的乱序执行应该采用了更加激进的硬件优化策略,否则也没有机会发现这个GC的Bug。
  1. https://hg.openjdk.java.net/jdk/jdk/rev/167cb7b4cd81
  2. https://bugs.openjdk.java.net/browse/JDK-8229169
  3. https://mail.openjdk.java.net/pipermail/hotspot-gc-dev/2019-August/026684.html

返回: 首页 | 社区新闻 |  龙芯OpenJdk

本页面最后修改于2019年10月15日 (星期二) 20:34。

© 2019 by 龙芯开源社区 • Powered by MediaWiki
京ICP备14017781号