Staffan, Looks good for me.
-Dmitry On 2013-12-02 20: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 > -- Dmitry Samersoff Oracle Java development team, Saint Petersburg, Russia * I would love to change the world, but they won't give me the sources.