HotSpot and IBM's J9 behave quite differently when processing monitorenters and monitorexits
陈雨亭
chenyt at cs.sjtu.edu.cn
Wed May 17 20:13:16 UTC 2017
I have tested several programs (in Jimple) and found that
HotSpot and J9 match monitorenters and monitorexits quite
differently. Verifiers should play more important roles here.
(1) Test the next program (r2 is not initizlied) on HotSpot and J9.
J9 throw out a verifier error, while HotSpot does not. It seems that
HotSpot's verifier forgets to check whether a monitored object
is initialized.
public class Search extends java.lang.Object
{
public void <init>()
{
Search r0;
r0 := @this: Search;
specialinvoke r0.<java.lang.Object: void <init>()>();
return;
}
public void main(java.lang.String[]) throws java.lang.Exception
{
Search r0;
Search r2;
java.lang.String[] r1;
r0 := @this: Search;
r1 := @parameter0: java.lang.String[];
r2 = new Search;
entermonitor r2;
entermonitor r0;
exitmonitor r2;
exitmonitor r0;
return;
}
}
(2) Test the next program on HotSpot and J9, and both do not report
any errors. However, I guess the order in the program (entermonitor r2; =>
entermonitor r0; => exitmonitor r2; => exitmonitor r0;) violates the
situation of "structured locking" (Structured locking is the situation when,
during a method invocation, every exit on a given monitor matches a
preceding entry on that monitor, see the specification
https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.11.10)
?
Actually, the words (every exit on a given monitor matches a preceding
entry on that monitor) are not quite clear as for me. Otherwise the first
rule
(The number of monitor entries performed by T on M during a
method invocation must equal the number of monitor exits performed
by T on M during the method invocation whether the method
invocation completes normally or abruptly.) is sufficient.
public class Search extends java.lang.Object
{
public void <init>()
{
Search r0;
r0 := @this: Search;
specialinvoke r0.<java.lang.Object: void <init>()>();
return;
}
public void main(java.lang.String[]) throws java.lang.Exception
{
Search r0;
Search r2;
java.lang.String[] r1;
r0 := @this: Search;
r1 := @parameter0: java.lang.String[];
r2 = new Search;
specialinvoke r2.<Search: void <init>()>();
entermonitor r2;
entermonitor r0;
exitmonitor r2;
exitmonitor r0;
return;
}
}
(3) The next program enters monitor in <init> and exits it in main().
HotSpot throws a runtime exception, while J9 does not. Should this
program be rejected by the verifiers?
public class Search extends java.lang.Object
{
public void <init>()
{
Search r0;
r0 := @this: Search;
specialinvoke r0.<java.lang.Object: void <init>()>();
entermonitor r0;
return;
}
public void main(java.lang.String[]) throws java.lang.Exception
{
Search r0;
Search r2;
java.lang.String[] r1;
r0 := @this: Search;
r1 := @parameter0: java.lang.String[];
r2 = new Search;
specialinvoke r2.<Search: void <init>()>();
exitmonitor r2;
exitmonitor r0;
return;
}
}
More information about the hotspot-runtime-dev
mailing list