want your help
Yongqiang Yang
xiaoqiangnk at gmail.com
Wed Dec 8 22:44:03 PST 2010
Hi David Holmes,
Thank you very much.
Maybe I didn't elaborate the problem clearly.
Java_java_lang_ref_Finalizer_invokeFinalizeMethod is a native method. It
invokes GetObjectClass and CallVoidMethod. So jump
to Java_java_lang_ref_Finalizer_invokeFinalizeMethod via a native wrapper.
Thus returns from it uses a native return wrapper. Callings or returns
of GetObjectClass and CallVoidMethod are done by g++.
The bug is as follows.
Before return from GetObjectClass, the ob's value is right, that it
references a right object. However, when CallVoidMethod begins, ob
references a invalid object.
During the change, Finalizer-Thread is in native
method Java_java_lang_ref_Finalizer_invokeFinalizeMethod. That
says Finalizer-Thread runs codes compiled by g++ during the change.
I think another thread changes ob's value, but I can't think of any thread
except GC.
On Thu, Dec 9, 2010 at 10:27 AM, David Holmes <David.Holmes at oracle.com>wrote:
> -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
>>
>>
--
Best Wishes
Yongqiang Yang
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.openjdk.java.net/pipermail/hotspot-dev/attachments/20101209/921b4c59/attachment.html
More information about the hotspot-dev
mailing list