Application (GC) stuck in "_Jv_MarkArray" when doing "klass->getName();"

Martin Egholm Nielsen martin@egholm-nielsen.dk
Mon Mar 27 11:55:00 GMT 2006


Hi,

> You somehow want to move the getName call out of the collector.  Calling
> it from GC_dump() or a partial clone, and then calling that from a
> debugger or the client code should work.  Just printing klass and then
> using a debugger to perform the getName() call should also work.  As
> should dumping the klass values into a static buffer, and then later
> traversing it and performing the getName call.
I made a terrible hack, caching the array when gc'ing and then dumping 
the stuff in the next call to "_Jv_GCTotalMemory".
But that reveal much, since it was just an array of "java.lang.Object".

The next thing is to invoke "toString()" on the elements, so I may get 
an idea of what they consist of...

> The problem is that the collector isn't designed to allocate
> garbage-collected memory while you're in the middle of the garbage
> collector, particularly in non-incremental mode.
Makes sense...

// Martin

>>-----Original Message-----
>>From: java-owner@gcc.gnu.org [mailto:java-owner@gcc.gnu.org] 
>>On Behalf Of Martin Egholm Nielsen
>>Sent: Monday, March 20, 2006 4:21 AM
>>To: java@gcc.gnu.org
>>Subject: Re: Application (GC) stuck in "_Jv_MarkArray" when 
>>doing "klass->getName();"
>>
>>
>>>>I haven't checked, but I'd be suspicious that getName allocates 
>>>>memory, which acquires the GC lock, which is already held 
>>
>>by the same thread.
>>
>>>>(This is a non-reentrant lock.  Which is good, because 
>>
>>things would 
>>
>>>>fail in more complex ways if it weren't.)
>>>
>>>Well, going into getName seems to trace furhter to 
>>
>>"_Jv_AllocString" 
>>
>>>using "_Jv_AllocPtrFreeObj" or "_Jv_AllocPtrFreeObject" 
>>
>>depending on 
>>
>>>the state of "ENABLE_JVMPI". However, now things get deep 
>>
>>for me - at 
>>
>>>least at my current state of knowledge...
>>>So I don't really know where that leaves the question regarding the 
>>>non-reentrant lock... :-)
>>
>>But if this is indeed a matter of locking, what other means 
>>do I have at that point (_Jv_MarkArray) to identify what the 
>>array is actually about?
>>
>>// Martin
>>
>>
>>>>On Sat, 18 Mar 2006, Martin Egholm Nielsen wrote:
>>>>
>>>>
>>>>>Hi there,
>>>>>
>>>>>In my long and tiresome (for the rest of you) attempts to 
>>
>>understand 
>>
>>>>>the doubling of my GC-times, I've now added some output 
>>
>>to "_Jv_MarkArray"
>>
>>>>>to get an idea of what and why there is suddenly an array 
>>
>>given of 
>>
>>>>>length 170.000.
>>>>>(This attempt is a consequence of calling "gcj_describe_type_fn" 
>>>>>from the GC, but it just halted.) So I added parts of the 
>>
>>the code 
>>
>>>>>from "gcj_describe_type_fn" into
>>>>>_Jv_MarkArray:
>>>>>
>>>>>  if ( klass ) {
>>>>>      printf( "MEN: 1\n" );
>>>>>      jstring name = klass -> getName();
>>>>>      printf( "MEN: 2\n" );
>>>>>  } // if
>>>>>
>>>>>However, when the GC gets to it, "1" is printed, "2" is 
>>
>>not, and the 
>>
>>>>>GC is stuck in between.
>>>>>Anyone can tell me why this is not "allowed"/fails?
>>>>>
>>>>>BR,
>>>>> Martin Egholm
>>>>>
>>>>>
>>>>
>>>>
>>>
>>
> 



More information about the Java mailing list