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; };