怎么查一个 JVM bug 在哪个 release 中被 fix?

subchen 2014-04-08
比如这个bug:http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6311057

里面注明的是: Fixed Versions: 6 (b53)

但是并不存在 jdk6u53,这个 b53 应该不是 release 的版本号。

哪位大侠知道怎么看这个bug在什么release被正式修复的?
RednaxelaFX 2014-04-08
Sun JDK6 build 53是JDK6正式发布前的开发版。也就是说在正式发布的时候已经修了
subchen 2014-04-09
多谢 RednaxelaFX,不过还有点疑问,帮忙解惑一下.

目前正在查这个 bug:http://bugs.java.com/bugdatabase/view_bug.do?bug_id=8025563
Fixed Versions: 6u71 (b01)
这个“Fixed Versions”又如何做解? jdk6u71? 也不存在啊。目前最高就 6u45.

=======================================================
下面是要跟踪的 bug 一些自己分析的结果:

POSIX提供的标准计时器API进行封装,主要提供了两种类型的时钟的封装。
一种是CLOCK_REALTIME,另一种是CLOCK_MONOTONIC。

CLOCK_REALTIME:
Systemwide realtime clock. 系统范围内的实时时钟。这种类型的时钟可以反映wall clock time,用的是绝对时间,其当time-of-day 被修改的时候而改变,这包括NTP对它的修改,这种类型的时钟可以得到相应的调整,也就是说,系统时间影响这种类型的timer。

CLOCK_MONOTONIC:
Represents monotonic time. Cannot be set. 表示单调时间,不能被设置的。用的是相对时间,他的时间是通过jiffies值来计算的。该时钟不受系统时钟源的影响,只受jiffies值的影响。它不受任何系统time-of-day时钟修改的影响,如果你想计算出在一台计算机上不受重启的影响,两个事件发生的间隔时间的话,那么它将是最好的选择。

改BUG只在 Linux 系统上存在,window上没有问题,Solaris 暂时未知。

当前 JDK1.6.0_29-b11 中受影响的方法:
  • System.currentTimeMillis()
  • Thread.sleep()
  • Object.wait()
  • LockSupport.parkNanos()
  • TimeUnit.sleep()

下面的方法不受影响:
  • System.nanoTime()

目前我们的系统跑在如下的环境:
# uname -a
Linux IS-CDSM-166 2.6.32.61-cds-64 #1 SMP PREEMPT Tue Feb 25 20:23:18 PST 2014 x86_64 x86_64 x86_64 GNU/Linux
# java -version
java version "1.6.0_29"
Java(TM) SE Runtime Environment (build 1.6.0_29-b11)
Java HotSpot(TM) 64-Bit Server VM (build 20.4-b02, mixed mode)


有什么方法在不升级系统jdk的情况下解决该问题? jni native?
  • System.currentTimeMillis() – 可以 native 实现
  • Thread.sleep()  – 可以 native 实现
  • Object.wait() – 似乎无法用 native 实现(和 jvm 内部对象相关)
  • LockSupport.parkNanos() – 似乎无法替换(Concurrent Lock 内部用到了改方法)
  • TimeUnit.sleep() – 暂时没有用到

如果必须升级jdk的话,应该升级到什么版本上 jdk6u45?

RednaxelaFX 2014-04-09
subchen 写道
目前正在查这个 bug:http://bugs.java.com/bugdatabase/view_bug.do?bug_id=8025563
Fixed Versions: 6u71 (b01)
这个“Fixed Versions”又如何做解? jdk6u71? 也不存在啊。目前最高就 6u45.

首先你应该用新的地址:https://bugs.openjdk.java.net/browse/JDK-8025563
Sun的Bug Database现在已经不用了,只是放在那里让以前的地址还有效。
新的Bug System是Oracle架的OpenJDK JIRA。

然后JDK 6 update 71当然是存在的,只不过只有付费用户才可以获取。
(翻译:要获取JDK6u45之后的JDK6请买Oracle服务…不,买Azul Zulu也行,比Oracle的服务便宜多了

但是看起来JDK6u71并没有包含这个fix,因为Oracle是在Linux 2.4系列内核上构建JDK6的,于是有些差异使得这个fix在Linux 2.6系列内核上解决不了。

您要是能自己构建HotSpot VM的话,可以自己打patch:
http://hg.openjdk.java.net/jdk8/jdk8/hotspot/rev/2e6938dd68f2
(或者购买Azul Zulu更物美价廉…再广告一遍)
subchen 2014-04-09
非常感谢 RednaxelaFX 的回复,看来在 jdk 6 上解决这个问题是没啥希望了。
正在测试 jdk 8 是否解决了该问题。然后在评估一下 升级到 jdk8 的风险。
subchen 2014-04-09
在 jdk8 目前测试结果已经被修复。
Global site tag (gtag.js) - Google Analytics