HotSpot and IBM's J9 behave quite differently when processing monitorenters and monitorexits
David Holmes
david.holmes at oracle.com
Wed May 17 21:40:58 UTC 2017
Hi,
On 18/05/2017 7:23 AM, 陈雨亭 wrote:
> Am I wrong?
I will look at each situation in detail when I get a chance but
structured locking enforcement is optional. Also balancing the number of
locks and unlocks in a frame does not mean they can't be locked and
unlocked in a non-nested fashion - just that by the end the number of
unlocks matches the number of locks.
BTW the way you respond to these emails, as if having a conversation
with yourself, makes it difficult to respond as we can't readily see
what is the new email and what is the original.
Cheers,
David
> The byte code for main() in case 1 is as follows. The strange thing is that
> NullPointerException is also not thrown at runtime.
>
> public void main(java.lang.String[]) throws java.lang.Exception;
> descriptor: ([Ljava/lang/String;)V
> flags: ACC_PUBLIC
> Code:
> stack=3, locals=2, args_size=2
> 0: new #2 // class Search
> 3: dup
> 4: aload_0
> 5: monitorenter
> 6: monitorenter
> 7: monitorexit
> 8: aload_0
> 9: monitorexit
> 10: return
> Exceptions:
> throws java.lang.Exception
>
> 主题: HotSpot and IBM's J9 behave quite differently when processing
> monitorenters and monitorexits
>
> 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