want your help

David Holmes David.Holmes at oracle.com
Wed Dec 8 18:27:16 PST 2010


-Xcomp compiles every method on first use, rather than only compiling 
when the method becomes "hot".

If the test passes in -Xmixed but not -Xcomp then it is likely that in 
-Xmixed the problematic code is not getting compiled. (Use 
-XX:+PrintCompilation to check - may need a debug VM for that).

The jobject is an opaque reference to the object for which finalize() is 
to be invoked. Even if safepoints occur and GC occurs etc, this should 
remain a valid reference. If that is not the case then something is 
corrupting the value. The stacktrace from the assert should show where 
the corruption is detected, which may help, but it won't show where it 
occurred. It could be something as simple as not setting up the correct 
register usage for return from the native method - ie your method return 
from GetObjectClass might be trashing the register that holds "ob". I 
think you would need to be able to dump dissassenbly of both methods to 
see if there is obvious corruption.

David Holmes

Yongqiang Yang said the following on 12/09/10 11:57:
> Hi Gary,
> 
> 
> That you for your help very much.
>  
> I have looked as you suggested.  There is no safepoint rom return at 
> GetObjectClass to calling CallVoidMethod. 
> 
> This bug  appears in Finalizer thread every time. Thus, I think maybe 
> there is a bug in finalizer.  When I use -Xcomp option, finalize 
> function is not called.  When I 
> use mixed or interpretered jvm, finalize is called.  I don't know what 
> happens in -Xcomp mode.  I  find that finalizer  is registered using 
> -XX:+TraceRegisterdFinalizer.
> 
> 
> On Wed, Dec 8, 2010 at 5:49 PM, Gary Benson <gbenson at redhat.com 
> <mailto:gbenson at redhat.com>> wrote:
> 
>     Hi Yongqiang,
> 
>     Yongqiang Yang wrote:
>      > Hi everyone,
>      >
>      > I am porting hotspot to MIPS.  I meet a bug as follows.
>      >
>      > In function Java_java_lang_ref_Finalizer_invokeFinalizeMethod,
>      > value of jobject is right when call GetObjectClass and also right
>      > before return from GetObjectClass . However,  it is wrong when
>      > calling CallVoidMethod.   For example, It is changed from 0x3e0885d0
>      > to 0x423ce794.
>      > Thus, it results in an assert failure below.
>      >
>     ----------------------------------------------------------------------
>      >   assert(SharedSkipVerify || obj->is_oop()) failed: sanity check
>      >
>     ----------------------------------------------------------------------
>      >
> 
>      > I want to know who will change this value from return at
>     GetObjectClass
>      > to calling CallVoidMethod.  During this time, GC don't run.
> 
>      >
>      > Could anyone have an idea about this?
> 
>     Look at the source code to jni_GetMethodID and jni_CallVoidMethod,
>     in hotspot/src/share/vm/prims/jni.cpp.  Notice the JNI_ENTRY and
>     JNI_END surrounding them?  Look at the source code for JNI_ENTRY,
>     in hotspot/src/share/vm/runtime/interfaceSupport.hpp.  Do you see
>     the ThreadInVMfromNative?  That object has a constructor and a
>     destructor, both of which contain thread state transitions.
>     Safepoints can occur during those transitions, and oops can change
>     at any safepoint regardless of whether the GC runs.  You could try
>     running with -XX:+TraceSafepoint or something like that to see if
>     one is occuring.
> 
>     Cheers,
>     Gary
> 
>     --
>     http://gbenson.net/
> 
> 
> 
> 
> -- 
> Best Wishes
> Yongqiang Yang
> 


More information about the hotspot-dev mailing list