RFR: JDK-8029395 SA: jstack throws WrongTypeException

Staffan Larsen staffan.larsen at oracle.com
Wed Dec 4 05:40:13 PST 2013


Thanks Mikael, Dmitry and Bengt!

On 4 dec 2013, at 13:53, Bengt Rutisson <bengt.rutisson at oracle.com> wrote:

> 
> Hi Staffan,
> 
> Looks good.
> 
> Thanks,
> Bengt
> 
> On 2013-12-02 17:30, Staffan Larsen wrote:
>> The problem here happens when SA wants to walk every object in the heap, to do that it needs to figure out what parts of the heap are in active use (the "live regions"). It gets the list of GC spaces as a start. It then maps out the TLABs in these spaces so that it will not walk un-allocated memory in the TLABs.
>> 
>> In this case, it misses one (or more) active TLABs and so tries to walk memory that is part of a TLAB, but that has not been allocated to an object yet. In a fast debug build this will be filled with 0xbaadbabe and while dereferencing this memory it fails with a WrongTypeException. Sometimes it will also fail with an UnmappedAddressException, but these exceptions are ignored in this part of SA (for some reason).
>> 
>> The TLAB that SA misses is one in a compiler thread. The code in SA does:
>> 
>>     if (VM.getVM().getUseTLAB()) {
>>       for (JavaThread thread = VM.getVM().getThreads().first(); thread != null; thread = thread.next()) {
>>         if (thread.isJavaThread()) {
>>           ThreadLocalAllocBuffer tlab = thread.tlab();
>>           ....
>> 
>> The problem is that thread.isJavaThread() will return false for CompilerThread (and some others) although they can have TLABs that we need to look at. The solution is to remove that check.
>> 
>> I’ve left some debugging code in place in the code that I think can be useful for other problems. The real fix is just two lines of code.
>> 
>> webrev: http://cr.openjdk.java.net/~sla/8029395/webrev.00/
>> bug: https://bugs.openjdk.java.net/browse/JDK-8029395
>> 
>> Thanks,
>> /Staffan
> 



More information about the serviceability-dev mailing list