Mercurial > hg > release > heapstats-1.1
changeset 12:87dc27ccb8b0
Bug 1644: Can't hook FullGC when G1 Evacuation Failure occurs.
reviewed-by: ykubota
author | Yasumasa Suenaga <suenaga.yasumasa@lab.ntt.co.jp> |
---|---|
date | Wed, 15 Jan 2014 10:10:35 +0900 |
parents | c7690676c2a6 |
children | 87dbb2865c68 |
files | agent/ChangeLog agent/src/oopUtil.cpp agent/src/oopUtil.hpp agent/src/overrideFunc.S |
diffstat | 4 files changed, 49 insertions(+), 22 deletions(-) [+] |
line wrap: on
line diff
--- a/agent/ChangeLog Thu Jan 09 13:16:51 2014 +0900 +++ b/agent/ChangeLog Wed Jan 15 10:10:35 2014 +0900 @@ -1,3 +1,7 @@ +2014-01-15 Yasumasa Suenaga <suenaga.yasumasa@lab.ntt.co.jp> + + * Bug 1644: Can't hook FullGC when G1 Evacuation Failure occurs. + 2014-01-09 Yasumasa Suenaga <suenaga.yasumasa@lab.ntt.co.jp> * Bug 1633: Cannot attach HeapStats agent to OpenJDK7 in Fedora20
--- a/agent/src/oopUtil.cpp Thu Jan 09 13:16:51 2014 +0900 +++ b/agent/src/oopUtil.cpp Wed Jan 15 10:10:35 2014 +0900 @@ -146,7 +146,7 @@ /*! * \brief Override function for cleanup and System.gc() event on G1GC. */ -DEFINE_OVERRIDE_FUNC_2(g1Event); +DEFINE_OVERRIDE_FUNC_3(g1Event); /*! * \brief Override function for adjust klassOop. @@ -839,9 +839,12 @@ HOOK_FUNC("_ZTV9CMCleanUp", "_ZN9CMCleanUp7do_voidEv", &g1Event_override_func_0, NULL), - HOOK_FUNC("_ZTV16VM_G1CollectFull", - "_ZN16VM_G1CollectFull4doitEv", - &g1Event_override_func_1, (void*)&callbackForG1FullReturn), + HOOK_FUNC("_ZTV15G1CollectedHeap", + "_ZN15G1CollectedHeap11gc_prologueEb", + &g1Event_override_func_1, NULL), + HOOK_FUNC("_ZTV15G1CollectedHeap", + "_ZN15G1CollectedHeap11gc_epilogueEb", + &g1Event_override_func_2, NULL), HOOK_FUNC_END }; @@ -1987,8 +1990,17 @@ /*! * \brief Callback function for before System.gc() on using G1GC. + * \param isFull [in] Is this event FullGC? */ -extern "C" void callbackForG1Full(void) { +extern "C" void callbackForG1Full(bool isFull){ + + /* This function must be processed when FullGC occurs. + * e.g. System.gc(), evacuation failure, etc... + */ + if(!isFull){ + return; + } + /* * Disable G1 callback function: * OopClosure for typeArrayKlass is called by G1 FullCollection. @@ -2002,20 +2014,27 @@ /*! * \brief Callback function for after System.gc() on using G1GC. + * \param isFull [in] Is this event FullGC? */ -extern "C" void callbackForG1FullReturn(void) { - - /* Restore G1 callback. */ - switchOverrideFunction(g1_hook, true); - - if (likely(g1FinishCallbackFunc != NULL)) { - - /* Invoke callback. */ - g1FinishCallbackFunc(); - } - - /* Clear bitmap. */ - checkObjectMap->clear(); +extern "C" void callbackForG1FullReturn(bool isFull){ + + /* This function must be processed when FullGC occurs. + * e.g. System.gc(), evacuation failure, etc... + */ + if(!isFull){ + return; + } + + /* Restore G1 callback. */ + switchOverrideFunction(g1_hook, true); + + if(likely(g1FinishCallbackFunc != NULL)){ + /* Invoke callback. */ + g1FinishCallbackFunc(); + } + + /* Clear bitmap. */ + checkObjectMap->clear(); } /*!
--- a/agent/src/oopUtil.hpp Thu Jan 09 13:16:51 2014 +0900 +++ b/agent/src/oopUtil.hpp Wed Jan 15 10:10:35 2014 +0900 @@ -414,13 +414,15 @@ /*! * \brief Callback function for before System.gc() on using G1GC. + * \param isFull [in] Is this event FullGC? */ -extern "C" void callbackForG1Full(void); +extern "C" void callbackForG1Full(bool isFull); /*! * \brief Callback function for after System.gc() on using G1GC. + * \param isFull [in] Is this event FullGC? */ -extern "C" void callbackForG1FullReturn(void); +extern "C" void callbackForG1FullReturn(bool isFull); /*! * \brief Callback function for WatcherThread.
--- a/agent/src/overrideFunc.S Thu Jan 09 13:16:51 2014 +0900 +++ b/agent/src/overrideFunc.S Wed Jan 15 10:10:35 2014 +0900 @@ -565,8 +565,10 @@ /* CMCleanUp::do_void() */ OVERRIDE_CALLBACK_DEFINE(g1Event, 0, callbackForG1Cleanup, 1); -/* VM_G1CollectFull::doit() */ -OVERRIDE_CALLBACK_DEFINE(g1Event, 1, callbackForG1Full, 1); +/* G1CollectedHeap::gc_prologue() */ +OVERRIDE_CALLBACK_DEFINE(g1Event, 1, callbackForG1Full, 2); +/* G1CollectedHeap::gc_epilogue() */ +OVERRIDE_CALLBACK_DEFINE(g1Event, 2, callbackForG1FullReturn, 2); /* for Klass relocation. */