changeset 264:f589aab41113

Bug 3528: Support Serial GC on JDK 10 Reviewed-by: ykubota https://github.com/HeapStats/heapstats/pull/137
author Yasumasa Suenaga <yasuenag@gmail.com>
date Tue, 03 Apr 2018 19:32:43 +0900
parents ef2f9bc6aecb
children 40b75a7c1861
files ChangeLog agent/src/heapstats-engines/jvmInfo.hpp agent/src/heapstats-engines/overrideFunc.S agent/src/heapstats-engines/overrider.cpp agent/src/heapstats-engines/overrider.hpp
diffstat 5 files changed, 112 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Mon Apr 02 10:55:22 2018 +0900
+++ b/ChangeLog	Tue Apr 03 19:32:43 2018 +0900
@@ -1,3 +1,7 @@
+2018-04-03 Yasumasa Suenaga <yasuenag@gmail.com>
+
+	* Bug 3528: Support Serial GC on JDK 10
+
 2018-04-02 Yasumasa Suenaga <yasuenag@gmail.com>
 
 	* Bug 3527: Remove unused code for deadlock detector
--- a/agent/src/heapstats-engines/jvmInfo.hpp	Mon Apr 02 10:55:22 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.
    */
--- a/agent/src/heapstats-engines/overrideFunc.S	Mon Apr 02 10:55:22 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.<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-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*) */
--- a/agent/src/heapstats-engines/overrider.cpp	Mon Apr 02 10:55:22 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 *).<br>
+ *        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 *).<br>
  *        This function is targeted for G1ParScanAndMarkExtRootClosure.
  *        (initial-mark for G1)
@@ -1586,6 +1639,16 @@
 }
 
 /*!
+ * \brief Callback function for OopClosure::do_oop(narrowOop *).<br>
+ *        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.<br>
  *        This function is targeted for Young Gen only.
  * \param oop [in] Java heap object(OopDesc format).
--- a/agent/src/heapstats-engines/overrider.hpp	Mon Apr 02 10:55:22 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);