want your help
David Holmes
David.Holmes at oracle.com
Wed Dec 8 23:06:40 PST 2010
Hi,
Yongqiang Yang said the following on 12/09/10 16:44:
> 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++.
Sorry - You said you were porting to MIPS so I was pointing out that the
problem might be in the MIPS code that handles native method calls eg by
clobbering a register that might be used in the callee. But I just
realized that is for calls from Java to native, not from native to Java
- the latter is all basic C++ code as you point out.
> 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.
Are you certain there is no gc occurring? If not, and the ob value has
changed when GetObjectClass returns then I can only assume some kind of
memory stomp during the execution of GetObjectClass. Can you add some
extra local variables and check their values to see if it is a stack stomp?
Does the problem occur with -Xint? Is compilation occurring elsewhere?
David
-----
>
> 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
> <mailto: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> <mailto: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
>
More information about the hotspot-dev
mailing list