Mercurial > hg > heapstats
changeset 160:6908c38421c4
Bug 2919: [JDK 9] Add Serial and Parallel GC hook for JDK 9
author | Yasumasa Suenaga <yasuenag@gmail.com> |
---|---|
date | Mon, 18 Apr 2016 21:28:47 +0900 |
parents | 488fb0589030 |
children | cd0f0916adec |
files | agent/src/heapstats-engines/jvmInfo.hpp agent/src/heapstats-engines/overrideFunc.S agent/src/heapstats-engines/overrider.cpp agent/src/heapstats-engines/overrider.hpp agent/src/heapstats-engines/vmVariables.cpp agent/src/heapstats-engines/vmVariables.hpp |
diffstat | 6 files changed, 101 insertions(+), 9 deletions(-) [+] |
line wrap: on
line diff
--- a/agent/src/heapstats-engines/jvmInfo.hpp Mon Apr 18 21:28:36 2016 +0900 +++ b/agent/src/heapstats-engines/jvmInfo.hpp Mon Apr 18 21:28:47 2016 +0900 @@ -1,7 +1,7 @@ /*! * \file jvmInfo.hpp * \brief This file is used to get JVM performance information. - * Copyright (C) 2011-2015 Nippon Telegraph and Telephone Corporation + * Copyright (C) 2011-2016 Nippon Telegraph and Telephone Corporation * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -398,6 +398,13 @@ } /*! + * \brief Running on JDK 9 or not. + */ + inline bool isAfterJDK9(void) { + return (this->_hsVersion >= MAKE_HS_VERSION(26, 0, 0, 0)); + } + + /*! * \brief Get Java version. * \return Java version. */
--- a/agent/src/heapstats-engines/overrideFunc.S Mon Apr 18 21:28:36 2016 +0900 +++ b/agent/src/heapstats-engines/overrideFunc.S Mon Apr 18 21:28:47 2016 +0900 @@ -3,7 +3,7 @@ * \brief This file is used to override JVM inner function.<br> * The function defined this file, used with v-table hook.<br> * So in this file, all function is written by only assembler and macro. - * Copyright (C) 2011-2015 Nippon Telegraph and Telephone Corporation + * Copyright (C) 2011-2016 Nippon Telegraph and Telephone Corporation * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -228,6 +228,20 @@ OVERRIDE_DEFINE_WITHOUT_PERMCHECK(watcherThread, 0, 1) +/* For JDK 9 Serial / Parallel GC hook */ + +/* InstanceKlass::oop_ms_adjust_pointers(oopDesc*) */ +OVERRIDE_DEFINE(par_jdk9, 0, 2) +/* ObjArrayKlass::oop_ms_adjust_pointers(oopDesc*) */ +OVERRIDE_DEFINE(par_jdk9, 1, 2) +/* TypeArrayKlass::oop_ms_adjust_pointers(oopDesc*) */ +OVERRIDE_DEFINE(par_jdk9, 2, 2) +/* InstanceRefKlass::oop_ms_adjust_pointers(oopDesc*) */ +OVERRIDE_DEFINE(par_jdk9, 3, 2) +/* InstanceClassLoaderKlass::oop_ms_adjust_pointers(oopDesc*) */ +OVERRIDE_DEFINE(par_jdk9, 4, 2) + + #ifdef AVOID__i686 /* Restore definition. */ #undef AVOID__i686
--- a/agent/src/heapstats-engines/overrider.cpp Mon Apr 18 21:28:36 2016 +0900 +++ b/agent/src/heapstats-engines/overrider.cpp Mon Apr 18 21:28:47 2016 +0900 @@ -1,7 +1,7 @@ /*! * \file overrider.cpp * \brief Controller of overriding functions in HotSpot VM. - * Copyright (C) 2014-2015 Yasumasa Suenaga + * Copyright (C) 2014-2016 Yasumasa Suenaga * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -55,6 +55,7 @@ */ DEFINE_OVERRIDE_FUNC_4(par); DEFINE_OVERRIDE_FUNC_5(par_6964458); +DEFINE_OVERRIDE_FUNC_5(par_jdk9); /*! * \brief Override function for heap object on parallelOldGC. @@ -179,6 +180,27 @@ #define CR8049421_par_hook CR8000213_par_hook /*! + * \brief Pointer of hook information on parallelGC for after jdk 9. + */ +THookFunctionInfo jdk9_par_hook[] = { + HOOK_FUNC(par_jdk9, 0, "_ZTV13InstanceKlass", + "_ZN13InstanceKlass22oop_ms_adjust_pointersEP7oopDesc", + &callbackForParallelWithMarkCheck), + HOOK_FUNC(par_jdk9, 1, "_ZTV13ObjArrayKlass", + "_ZN13ObjArrayKlass22oop_ms_adjust_pointersEP7oopDesc", + &callbackForParallelWithMarkCheck), + HOOK_FUNC(par_jdk9, 2, "_ZTV14TypeArrayKlass", + "_ZN14TypeArrayKlass22oop_ms_adjust_pointersEP7oopDesc", + &callbackForParallelWithMarkCheck), + HOOK_FUNC(par_jdk9, 3, "_ZTV16InstanceRefKlass", + "_ZN16InstanceRefKlass22oop_ms_adjust_pointersEP7oopDesc", + &callbackForParallelWithMarkCheck), + HOOK_FUNC(par_jdk9, 4, "_ZTV24InstanceClassLoaderKlass", + "_ZN24InstanceClassLoaderKlass22oop_ms_adjust_pointersEP7oopDesc", + &callbackForParallelWithMarkCheck), + HOOK_FUNC_END}; + +/*! * \brief Pointer of hook information on parallelGC. */ THookFunctionInfo *par_hook = NULL; @@ -263,6 +285,8 @@ */ #define CR8027746_parOld_hook CR8000213_parOld_hook #define CR8049421_parOld_hook CR8000213_parOld_hook +/* TODO: We have to define valid hook for JDK 9 */ +#define jdk9_parOld_hook CR8049421_parOld_hook /*! * \brief Pointer of hook information on parallelOldGC. @@ -362,6 +386,8 @@ */ #define CR8027746_cms_new_hook CR8000213_cms_new_hook #define CR8049421_cms_new_hook CR8000213_cms_new_hook +/* TODO: We have to define valid hook for JDK 9 */ +#define jdk9_cms_new_hook CR8049421_cms_new_hook /*! * \brief Pointer of hook information on CMSGC. @@ -604,6 +630,9 @@ &callbackForIterate), HOOK_FUNC_END}; +/* TODO: We have to define valid hook for JDK 9 */ +#define jdk9_g1_hook CR8049421_g1_hook + /*! * \brief Pointer of hook information on G1GC. */ @@ -1364,13 +1393,41 @@ * \param oop [in] Java heap object(OopDesc format). * \warning Param "oop" isn't usable for JVMTI and JNI. */ -void callbackForParallel(void *oop) { +inline void callbackForParallelInternal(void *oop) { /* Invoke callback by GC. */ gcCallbackFunc(oop, NULL); isInvokedParallelGC = true; } /*! + * \brief Callback function for parallel GC and user's GC.<br> + * E.g. System.gc() in java code, JVMTI and etc.. + * \param oop [in] Java heap object(OopDesc format). + * \warning Param "oop" isn't usable for JVMTI and JNI. + */ +void callbackForParallel(void *oop) { + callbackForParallelInternal(oop); +} + +/*! + * \brief Callback function for parallel GC and user's GC.<br> + * E.g. System.gc() in java code, JVMTI and etc.. + * This function checks markOop value. + * \param oop [in] Java heap object(OopDesc format). + * \warning Param "oop" isn't usable for JVMTI and JNI. + */ +void callbackForParallelWithMarkCheck(void *oop) { + TVMVariables *vmVal = TVMVariables::getInstance(); + unsigned long markOop = *(ptrdiff_t *)incAddress(oop, + vmVal->getOfsMarkAtOop()); + uint64_t markValue = markOop & vmVal->getLockMaskInPlaceMarkOop(); + + if (markValue == vmVal->getMarkedValue()) { + callbackForParallelInternal(oop); + } +} + +/*! * \brief Callback function for parallel Old GC. * \param oop [in] Java heap object(OopDesc format). * \warning Param "oop" isn't usable for JVMTI and JNI.
--- a/agent/src/heapstats-engines/overrider.hpp Mon Apr 18 21:28:36 2016 +0900 +++ b/agent/src/heapstats-engines/overrider.hpp Mon Apr 18 21:28:47 2016 +0900 @@ -1,7 +1,7 @@ /*! * \file overrider.hpp * \brief Controller of overriding functions in HotSpot VM. - * Copyright (C) 2014-2015 Yasumasa Suenaga + * Copyright (C) 2014-2016 Yasumasa Suenaga * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -162,7 +162,9 @@ * \brief Macro to select override function with CR. */ #define SELECT_HOOK_FUNCS(prefix) \ - if (jvmInfo->isAfterCR8049421()) { \ + if (jvmInfo->isAfterJDK9()) { \ + prefix##_hook = jdk9_##prefix##_hook; \ + } else if (jvmInfo->isAfterCR8049421()) { \ prefix##_hook = CR8049421_##prefix##_hook; \ } else if (jvmInfo->isAfterCR8027746()) { \ prefix##_hook = CR8027746_##prefix##_hook; \ @@ -227,6 +229,7 @@ /* extern functions (for overriding) */ extern "C" void callbackForParallel(void *oop); +extern "C" void callbackForParallelWithMarkCheck(void *oop); extern "C" void callbackForParOld(void *oop); extern "C" void callbackForDoOop(void **oop); extern "C" void callbackForDoNarrowOop(unsigned int *narrowOop);
--- a/agent/src/heapstats-engines/vmVariables.cpp Mon Apr 18 21:28:36 2016 +0900 +++ b/agent/src/heapstats-engines/vmVariables.cpp Mon Apr 18 21:28:47 2016 +0900 @@ -1,7 +1,7 @@ /*! * \file vmVariables.cpp * \brief This file includes variables in HotSpot VM.<br> - * Copyright (C) 2014-2015 Yasumasa Suenaga + * Copyright (C) 2014-2016 Yasumasa Suenaga * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -68,6 +68,7 @@ narrowKlassOffsetBase = 0; narrowKlassOffsetShift = 0; lockMaskInPlaceMarkOop = 0; + marked_value = 0; cmsBitMap_startWord = NULL; cmsBitMap_shifter = 0; cmsBitMap_startAddr = NULL; @@ -248,12 +249,13 @@ TLongConstMap longMap[] = { {"markOopDesc::lock_mask_in_place", &lockMaskInPlaceMarkOop}, + {"markOopDesc::marked_value", &marked_value}, /* End marker. */ {NULL, NULL}}; vmScanner->GetDataFromVMLongConstants(longMap); - if (unlikely(lockMaskInPlaceMarkOop == 0)) { + if (unlikely((lockMaskInPlaceMarkOop == 0) || (marked_value == 0))) { logger->printCritMsg("Cannot get values from VMLongConstants."); return false; } @@ -264,7 +266,9 @@ {NULL, NULL}}; vmScanner->GetDataFromVMIntConstants(intMap); + return true; + } /*!
--- a/agent/src/heapstats-engines/vmVariables.hpp Mon Apr 18 21:28:36 2016 +0900 +++ b/agent/src/heapstats-engines/vmVariables.hpp Mon Apr 18 21:28:47 2016 +0900 @@ -1,7 +1,7 @@ /*! * \file vmVariables.hpp * \brief This file includes variables in HotSpot VM. - * Copyright (C) 2014-2015 Yasumasa Suenaga + * Copyright (C) 2014-2016 Yasumasa Suenaga * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -205,6 +205,12 @@ uint64_t lockMaskInPlaceMarkOop; /*! + * \brief GC mark value.<br> + * Const value of marked_value in markOopDesc_place". + */ + uint64_t marked_value; + + /*! * \brief Pointer of CMS marking bitmap start word. */ void *cmsBitMap_startWord; @@ -382,6 +388,7 @@ inline uint64_t getLockMaskInPlaceMarkOop() { return lockMaskInPlaceMarkOop; }; + inline uint64_t getMarkedValue() { return marked_value; }; inline void *getCmsBitMap_startWord() { return cmsBitMap_startWord; }; inline int getCmsBitMap_shifter() { return cmsBitMap_shifter; }; inline size_t *getCmsBitMap_startAddr() { return cmsBitMap_startAddr; };