Cleaning static call stubs without cleaning the corresponding calls? (original) (raw)

Doug Simon @ Oracle doug.simon at oracle.com
Mon Nov 26 10:45:19 PST 2012


In the debug build of the Graal[1], I am seeing a hung VM caused by a thread spinning on an jump instruction that jumps to itself. Further investigation reveals this is the jump instruction in a static call stub. I can see that the stub is initialized properly in CompiledStaticCall::set_to_interpreted(). Then during a full GC, I see the stub is set to clean in nmethod::verify_metadata_loaders(). The strange thing is that the corresponding static (or opt_virtual) call is not reset at the same time. So, at some later point the static call goes to the stub which then starts spinning. Unless my diagnosis is flawed, I think the patch below fixes the problem.

diff -r 46bec43bdfc3 src/share/vm/code/nmethod.cpp --- a/src/share/vm/code/nmethod.cpp Wed Nov 21 23:36:06 2012 +0100 +++ b/src/share/vm/code/nmethod.cpp Thu Nov 22 22:42:30 2012 +0100 @@ -1802,11 +1802,13 @@ CompiledIC* cic = CompiledIC_at(iter.reloc()); if (!cic->is_call_to_interpreted()) { static_call_addr = iter.addr();

With this patch, I no longer see the hanging problem in Graal. The fact that this issue hasn't arisen for the debug builds of HotSpot makes me wonder if there is something else I'm missing...

-Doug

[1] http://openjdk.java.net/projects/graal/



More information about the hotspot-dev mailing list