Issue | Fix Version | Assignee | Priority | Status | Resolution | Resolved In Build |
---|---|---|---|---|---|---|
JDK-2181141 | 7 | Vladimir Kozlov | P3 | Closed | Fixed | b67 |
JDK-2182314 | 6u18 | Vladimir Kozlov | P3 | Closed | Fixed | b01 |
JDK-2200126 | 6u14 | Dmitriy Samersoff | P2 | Closed | Won't Fix |
java version "1.6.0_14"
Java(TM) SE Runtime Environment (build 1.6.0_14-b08)
Java HotSpot(TM) 64-Bit Server VM (build 14.0-b16, mixed mode)
java version "1.7.0-ea"
Java(TM) SE Runtime Environment (build 1.7.0-ea-b59)
Java HotSpot(TM) 64-Bit Server VM (build 16.0-b03, mixed mode)
FULL OS VERSION :
Linux mac 2.6.29.4-162.fc11.x86_64 #1 SMP Mon May 25 16:51:30 EDT 2009 x86_64 x86_64 x86_64 GNU/Linux
A DESCRIPTION OF THE PROBLEM :
When executing the included program, the array will contain null fields after the server JIT recompiles some of the methods even though that should be impossible.
This only happens with -XX:+UseCompressedOops. I tested with JDK6u14 and the latest JDK7 snapshot (b59)
THE PROBLEM WAS REPRODUCIBLE WITH -Xint FLAG: No
THE PROBLEM WAS REPRODUCIBLE WITH -server FLAG: Yes
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Run the included program with JDK6u14 -server -XX:+UseCompressedOops
EXPECTED VERSUS ACTUAL BEHAVIOR :
Expected results: nothing gets printed to the console
Actual results: The word "bug" is printed a few times.
Note that the problem does not occur if -XX:+UseCompressedOops is not used.
REPRODUCIBILITY :
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
package test;
import java.util.ArrayList;
import java.util.List;
public class Hs {
void foo(A a, A[] as) {
for (A a1 : as) {
B[] filtered = a.c(a1);
for (B b : filtered)
if (b == null) {
System.out.println("bug");
}
}
}
public static void main(String[] args) {
List<A> as = new ArrayList<A>();
for (int i = 0; i < 5000; i++) {
List<B> bs = new ArrayList<B>();
for (int j = i; j < i + 1000; j++)
bs.add(new B(j));
as.add(new A(bs.toArray(new B[0])));
}
new Hs().foo(as.get(0), as.subList(1, as.size()).toArray(new A[0]));
}
}
class A {
final B[] bs;
public A(B[] bs) {
this.bs = bs;
}
final B[] c(final A a) {
return new BoxedArray<B>(bs).filter(new Function<B, Boolean>() {
public Boolean apply(B arg) {
for (B b : a.bs) {
if (b.d == arg.d)
return true;
}
return false;
}
});
}
}
class BoxedArray<T> {
private final T[] array;
BoxedArray(T[] array) {
this.array = array;
}
public T[] filter(Function<T, Boolean> function) {
boolean[] include = new boolean[array.length];
int len = 0;
int i = 0;
while (i < array.length) {
if (function.apply(array[i])) {
include[i] = true;
len += 1;
}
i += 1;
}
T[] result = (T[]) java.lang.reflect.Array.newInstance(array.getClass().getComponentType(), len);
len = 0;
i = 0;
while (len < result.length) {
if (include[i]) {
result[len] = array[i];
len += 1;
}
i += 1;
}
return result;
}
}
interface Function<T, R> {
R apply(T arg);
}
class B {
final int d;
public B(int d) {
this.d = d;
}
}
---------- END SOURCE ----------
CUSTOMER SUBMITTED WORKAROUND :
Remove -XX:+UseCompressedOops switch.
- backported by
-
JDK-2200126 JIT miscompilation results in null entry in array when using CompressedOops
- Closed
-
JDK-2181141 JIT miscompilation results in null entry in array when using CompressedOops
- Closed
-
JDK-2182314 JIT miscompilation results in null entry in array when using CompressedOops
- Closed
- relates to
-
JDK-6826736 CMS: core dump with -XX:+UseCompressedOops
- Resolved
-
JDK-6860407 G1: crash during evacuation failure ostensibly due to prematurely collected reference
- Closed
-
JDK-6865031 Application gives bad result (throws bad exception) with compressed oops
- Closed
-
JDK-6819176 Compressed oops causes assert(n != 0L,"Bad immediate dominator info.")
- Closed