# HG changeset patch # User Yasumasa Suenaga # Date 1522751563 -32400 # Node ID 3538a375c464a35cffa3f19fc704a228bda1881d # Parent a4e61cec5f0e181a00bf8a2a5eb2060396af438a Bug 3528: Support Serial GC on JDK 10 Reviewed-by: ykubota https://github.com/HeapStats/heapstats/pull/137 diff -r a4e61cec5f0e -r 3538a375c464 ChangeLog --- a/ChangeLog Mon Apr 02 10:56:56 2018 +0900 +++ b/ChangeLog Tue Apr 03 19:32:43 2018 +0900 @@ -1,3 +1,7 @@ +2018-04-03 Yasumasa Suenaga + + * Bug 3528: Support Serial GC on JDK 10 + 2018-04-02 Yasumasa Suenaga * Bug 3527: Remove unused code for deadlock detector diff -r a4e61cec5f0e -r 3538a375c464 agent/src/heapstats-engines/jvmInfo.hpp --- a/agent/src/heapstats-engines/jvmInfo.hpp Mon Apr 02 10:56:56 2018 +0900 +++ b/agent/src/heapstats-engines/jvmInfo.hpp Tue Apr 03 19:32:43 2018 +0900 @@ -1,7 +1,7 @@ /*! * \file jvmInfo.hpp * \brief This file is used to get JVM performance information. - * Copyright (C) 2011-2016 Nippon Telegraph and Telephone Corporation + * Copyright (C) 2011-2018 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,13 +398,20 @@ } /*! - * \brief Running on JDK 9 or not. + * \brief Running on JDK 9 */ inline bool isAfterJDK9(void) { return (this->_hsVersion >= MAKE_HS_VERSION(1, 9, 0, 0, 0)); } /*! + * \brief Running on JDK 10 or later + */ + inline bool isAfterJDK10(void) { + return (this->_hsVersion >= MAKE_HS_VERSION(1, 10, 0, 0, 0)); + } + + /*! * \brief Get Java version. * \return Java version. */ diff -r a4e61cec5f0e -r 3538a375c464 agent/src/heapstats-engines/overrideFunc.S --- a/agent/src/heapstats-engines/overrideFunc.S Mon Apr 02 10:56:56 2018 +0900 +++ b/agent/src/heapstats-engines/overrideFunc.S Tue Apr 03 19:32:43 2018 +0900 @@ -3,7 +3,7 @@ * \brief This file is used to override JVM inner function.
* The function defined this file, used with v-table hook.
* So in this file, all function is written by only assembler and macro. - * Copyright (C) 2011-2016 Nippon Telegraph and Telephone Corporation + * Copyright (C) 2011-2018 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 @@ -241,6 +241,24 @@ /* InstanceClassLoaderKlass::oop_ms_adjust_pointers(oopDesc*) */ OVERRIDE_DEFINE(par_jdk9, 4, 2) +/* For JDK 10 Serial / Parallel GC hook */ + +/* AdjustPointerClosure::do_oop(oopDesc**) */ +OVERRIDE_DEFINE(par_jdk10, 0, 2) +/* AdjustPointerClosure::do_oop(unsigned int*) */ +OVERRIDE_DEFINE(par_jdk10, 1, 2) +/* InstanceKlass::oop_oop_iterate_nv(oopDesc*, MarkAndPushClosure*) */ +OVERRIDE_DEFINE(par_jdk10, 2, 2) +/* ObjArrayKlass::oop_oop_iterate_nv(oopDesc*, MarkAndPushClosure*) */ +OVERRIDE_DEFINE(par_jdk10, 3, 2) +/* TypeArrayKlass::oop_oop_iterate_nv(oopDesc*, MarkAndPushClosure*) */ +OVERRIDE_DEFINE(par_jdk10, 4, 2) +/* InstanceRefKlass::oop_oop_iterate_nv(oopDesc*, MarkAndPushClosure*) */ +OVERRIDE_DEFINE(par_jdk10, 5, 2) +/* InstanceClassLoaderKlass::oop_oop_iterate_nv(oopDesc*, MarkAndPushClosure*) */ +OVERRIDE_DEFINE(par_jdk10, 6, 2) + + /* For JDK 9 ParallelOld GC hook */ /* InstanceKlass::oop_pc_follow_contents(oopDesc*, ParCompactionManager*) */ diff -r a4e61cec5f0e -r 3538a375c464 agent/src/heapstats-engines/overrider.cpp --- a/agent/src/heapstats-engines/overrider.cpp Mon Apr 02 10:56:56 2018 +0900 +++ b/agent/src/heapstats-engines/overrider.cpp Tue Apr 03 19:32:43 2018 +0900 @@ -1,7 +1,7 @@ /*! * \file overrider.cpp * \brief Controller of overriding functions in HotSpot VM. - * Copyright (C) 2014-2017 Yasumasa Suenaga + * Copyright (C) 2014-2018 Yasumasa Suenaga * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -57,6 +57,7 @@ DEFINE_OVERRIDE_FUNC_4(par); DEFINE_OVERRIDE_FUNC_5(par_6964458); DEFINE_OVERRIDE_FUNC_5(par_jdk9); +DEFINE_OVERRIDE_FUNC_7(par_jdk10); /*! * \brief Override function for heap object on parallelOldGC. @@ -65,6 +66,7 @@ DEFINE_OVERRIDE_FUNC_5(parOld_6964458); DEFINE_OVERRIDE_FUNC_5(parOld_jdk9); + /*! * \brief Override function for sweep at old gen on CMSGC. */ @@ -205,6 +207,33 @@ HOOK_FUNC_END}; /*! + * \brief Pointer of hook information on parallelGC for after jdk 10. + */ +THookFunctionInfo jdk10_par_hook[] = { + HOOK_FUNC(par_jdk10, 0, "_ZTV20AdjustPointerClosure", + "_ZN20AdjustPointerClosure6do_oopEPP7oopDesc", + &callbackForDoOopWithMarkCheck), + HOOK_FUNC(par_jdk10, 1, "_ZTV20AdjustPointerClosure", + "_ZN20AdjustPointerClosure6do_oopEPj", + &callbackForDoNarrowOopWithMarkCheck), + HOOK_FUNC(par_jdk10, 2, "_ZTV13InstanceKlass", + "_ZN13InstanceKlass18oop_oop_iterate_nvEP7oopDescP18MarkAndPushClosure", + &callbackForParallelWithMarkCheck), + HOOK_FUNC(par_jdk10, 3, "_ZTV13ObjArrayKlass", + "_ZN13ObjArrayKlass18oop_oop_iterate_nvEP7oopDescP18MarkAndPushClosure", + &callbackForParallelWithMarkCheck), + HOOK_FUNC(par_jdk10, 4, "_ZTV14TypeArrayKlass", + "_ZN14TypeArrayKlass18oop_oop_iterate_nvEP7oopDescP18MarkAndPushClosure", + &callbackForParallelWithMarkCheck), + HOOK_FUNC(par_jdk10, 5, "_ZTV16InstanceRefKlass", + "_ZN16InstanceRefKlass18oop_oop_iterate_nvEP7oopDescP18MarkAndPushClosure", + &callbackForParallelWithMarkCheck), + HOOK_FUNC(par_jdk10, 6, "_ZTV24InstanceClassLoaderKlass", + "_ZN24InstanceClassLoaderKlass18oop_oop_iterate_nvEP7oopDescP18MarkAndPushClosure", + &callbackForParallelWithMarkCheck), + HOOK_FUNC_END}; + +/*! * \brief Pointer of hook information on parallelGC. */ THookFunctionInfo *par_hook = NULL; @@ -310,6 +339,7 @@ */ #define CR8027746_parOld_hook CR8000213_parOld_hook #define CR8049421_parOld_hook CR8000213_parOld_hook +#define jdk10_parOld_hook jdk9_parOld_hook /*! * \brief Pointer of hook information on parallelOldGC. @@ -431,6 +461,7 @@ */ #define CR8027746_cms_new_hook CR8000213_cms_new_hook #define CR8049421_cms_new_hook CR8000213_cms_new_hook +#define jdk10_cms_new_hook jdk9_cms_new_hook /*! * \brief Pointer of hook information on CMSGC. @@ -727,6 +758,8 @@ &callbackForIterate), HOOK_FUNC_END}; +#define jdk10_g1_hook jdk9_g1_hook + /*! * \brief Pointer of hook information on G1GC. */ @@ -1565,7 +1598,7 @@ return; } - if (checkObjectMap->checkAndMark(*oop)) { + if ((checkObjectMap != NULL) && checkObjectMap->checkAndMark(*oop)) { /* Object is already collected by G1GC collector. */ return; } @@ -1575,6 +1608,26 @@ } /*! + * \brief Callback function for OopClosure::do_oop(oop *).
+ * This function checks whether the oop is marked. + * \param oop [in] Java heap object(OopDesc format). + */ +void callbackForDoOopWithMarkCheck(void **oop) { + if ((oop == NULL) || (*oop == NULL) || is_in_permanent(collectedHeap, *oop)) { + return; + } + + TVMVariables *vmVal = TVMVariables::getInstance(); + unsigned long markOop = *(ptrdiff_t *)incAddress(oop, + vmVal->getOfsMarkAtOop()); + uint64_t markValue = markOop & vmVal->getLockMaskInPlaceMarkOop(); + + if (markValue == vmVal->getMarkedValue()) { + gcCallbackFunc(*oop, NULL); + } +} + +/*! * \brief Callback function for OopClosure::do_oop(narrowOop *).
* This function is targeted for G1ParScanAndMarkExtRootClosure. * (initial-mark for G1) @@ -1586,6 +1639,16 @@ } /*! + * \brief Callback function for OopClosure::do_oop(narrowOop *).
+ * This function checks whether the oop is marked. + * \param oop [in] Java heap object(OopDesc format). + */ +void callbackForDoNarrowOopWithMarkCheck(unsigned int *narrowOop) { + void *oop = getWideOop(*narrowOop); + callbackForDoOopWithMarkCheck(&oop); +} + +/*! * \brief Callback function for CMS GC and G1 GC.
* This function is targeted for Young Gen only. * \param oop [in] Java heap object(OopDesc format). diff -r a4e61cec5f0e -r 3538a375c464 agent/src/heapstats-engines/overrider.hpp --- a/agent/src/heapstats-engines/overrider.hpp Mon Apr 02 10:56:56 2018 +0900 +++ b/agent/src/heapstats-engines/overrider.hpp Tue Apr 03 19:32:43 2018 +0900 @@ -1,7 +1,7 @@ /*! * \file overrider.hpp * \brief Controller of overriding functions in HotSpot VM. - * Copyright (C) 2014-2016 Yasumasa Suenaga + * Copyright (C) 2014-2018 Yasumasa Suenaga * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -124,6 +124,15 @@ DEFINE_OVERRIDE_FUNC_N(prefix, 3) \ DEFINE_OVERRIDE_FUNC_N(prefix, 4) +#define DEFINE_OVERRIDE_FUNC_7(prefix) \ + DEFINE_OVERRIDE_FUNC_N(prefix, 0) \ + DEFINE_OVERRIDE_FUNC_N(prefix, 1) \ + DEFINE_OVERRIDE_FUNC_N(prefix, 2) \ + DEFINE_OVERRIDE_FUNC_N(prefix, 3) \ + DEFINE_OVERRIDE_FUNC_N(prefix, 4) \ + DEFINE_OVERRIDE_FUNC_N(prefix, 5) \ + DEFINE_OVERRIDE_FUNC_N(prefix, 6) + #define DEFINE_OVERRIDE_FUNC_8(prefix) \ DEFINE_OVERRIDE_FUNC_N(prefix, 0) \ DEFINE_OVERRIDE_FUNC_N(prefix, 1) \ @@ -176,7 +185,9 @@ * \brief Macro to select override function with CR. */ #define SELECT_HOOK_FUNCS(prefix) \ - if (jvmInfo->isAfterJDK9()) { \ + if (jvmInfo->isAfterJDK10()) { \ + prefix##_hook = jdk10_##prefix##_hook; \ + } else if (jvmInfo->isAfterJDK9()) { \ prefix##_hook = jdk9_##prefix##_hook; \ } else if (jvmInfo->isAfterCR8049421()) { \ prefix##_hook = CR8049421_##prefix##_hook; \ @@ -246,7 +257,9 @@ extern "C" void callbackForParallelWithMarkCheck(void *oop); extern "C" void callbackForParOld(void *oop); extern "C" void callbackForDoOop(void **oop); +extern "C" void callbackForDoOopWithMarkCheck(void **oop); extern "C" void callbackForDoNarrowOop(unsigned int *narrowOop); +extern "C" void callbackForDoNarrowOopWithMarkCheck(unsigned int *narrowOop); extern "C" void callbackForIterate(void *oop); extern "C" void callbackForSweep(void *oop); extern "C" void callbackForAdjustPtr(void *oop);