changeset 35:a4b4008e4ec0

Bug 1717: Reduce memory load operation. reviewed-by: ykubota
author Yasumasa Suenaga <suenaga.yasumasa@lab.ntt.co.jp>
date Fri, 28 Mar 2014 13:40:16 +0900
parents 48dc7c3ceee5
children 08fb9a9b6e84
files agent/ChangeLog agent/src/libmain.cpp agent/src/oopUtil.cpp agent/src/oopUtil.hpp agent/src/snapShotMain.cpp
diffstat 5 files changed, 97 insertions(+), 99 deletions(-) [+]
line wrap: on
line diff
--- a/agent/ChangeLog	Mon Mar 17 19:52:20 2014 +0900
+++ b/agent/ChangeLog	Fri Mar 28 13:40:16 2014 +0900
@@ -1,3 +1,7 @@
+2014-03-18  Yasumasa Suenaga  <suenaga.yasumasa@lab.ntt.co.jp>
+
+	* Bug 1717: Reduce memory load operation.
+
 2014-03-17  Yasumasa Suenaga  <suenaga.yasumasa@lab.ntt.co.jp>
 
 	* Bug 1647: Full mode log archiving does not work when using fifo pipe for gc log
--- a/agent/src/libmain.cpp	Mon Mar 17 19:52:20 2014 +0900
+++ b/agent/src/libmain.cpp	Fri Mar 28 13:40:16 2014 +0900
@@ -2,7 +2,7 @@
  * \file libmain.cpp
  * \brief This file is used to common works.<br>
  *        e.g. initialization, finalization, etc...
- * Copyright (C) 2011-2013 Nippon Telegraph and Telephone Corporation
+ * Copyright (C) 2011-2014 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
@@ -438,12 +438,12 @@
   
   /* If take snaoshot when occurred gc. */
   if (arg.triggerOnFullGC) {
-    if(*useCMS){
+    if(useCMS){
       callbacks.GarbageCollectionStart  = &OnCMSGCStart;
       callbacks.GarbageCollectionFinish = &OnCMSGCFinish;
     }
     /* FullGC on G1, we process at callbackForG1Full() */
-    else if (!*useG1){
+    else if(!useG1){
       callbacks.GarbageCollectionStart  = &OnGarbageCollectionStart;
       callbacks.GarbageCollectionFinish = &OnGarbageCollectionFinish;
     }
--- a/agent/src/oopUtil.cpp	Mon Mar 17 19:52:20 2014 +0900
+++ b/agent/src/oopUtil.cpp	Fri Mar 28 13:40:16 2014 +0900
@@ -1,7 +1,7 @@
 /*!
  * \file oopUtil.cpp
  * \brief This file is used to getting information inner JVM.<br>
- * Copyright (C) 2011-2013 Nippon Telegraph and Telephone Corporation
+ * Copyright (C) 2011-2014 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
@@ -181,48 +181,32 @@
 
 /* Variable. */
 
-/* Variable for pointer dummy. */
-
-/*!
- * \brief Dummy zero variable.<br> This variable is always 0.
- */
-int dummyZeroInt = 0;
-
-/*!
- * \brief Dummy false flag.<br> This variable is always false.
- */
-bool dummyFalseFlag = false;
-
 /* Define JVM paramter pointer variable for calling from external. */
 
 /*!
- * \brief Pointer to "-XX:UseCompressedOops".
+ * \brief Value of "-XX:UseCompressedOops" or "-XX:UseCompressedClassPointers".
  */
-#ifdef __LP64__
-bool *isCOOP      = NULL;
-#else
-bool *isCOOP      = &dummyFalseFlag;
-#endif
+bool isCOOP      = false;
 
 /*!
- * \brief Pointer to "-XX:UseParallelGC".
+ * \brief Value of "-XX:UseParallelGC".
  */
-bool *useParallel = NULL;
+bool useParallel = false;
 
 /*!
- * \brief Pointer to "-XX:UseParallelOldGC".
+ * \brief Value of "-XX:UseParallelOldGC".
  */
-bool *useParOld   = NULL;
+bool useParOld   = false;
 
 /*!
- * \brief Pointer to "-XX:UseConcMarkSweepGC".
+ * \brief Value of "-XX:UseConcMarkSweepGC".
  */
-bool *useCMS      = NULL;
+bool useCMS      = false;
 
 /*!
- * \brief Pointer to"-XX:UseG1GC".
+ * \brief Value of "-XX:UseG1GC".
  */
-bool *useG1       = NULL;
+bool useG1       = false;
 
 /*!
  * \brief CMS collector state pointer.
@@ -333,14 +317,14 @@
 ptrdiff_t narrowOffsetBase = 0;
 
 /*!
-* \brief Pointer of COOP shift bits.
+* \brief Value of COOP shift bits.
  */
-int *narrowOffsetShift     = &dummyZeroInt;
+int narrowOffsetShift     = 0;
 
 /*!
-* \brief Pointer of Klass COOP shift bits.
+* \brief Value of Klass COOP shift bits.
  */
-int *narrowKlassOffsetShift     = &dummyZeroInt;
+int narrowKlassOffsetShift     = 0;
 
 /*!
 * \brief Pointer of COOP base Klass address.
@@ -360,9 +344,9 @@
  */
 void *cmsBitMap_startWord    = NULL;
 /*!
- * \brief Pointer to shifter of CMS bitmap.
+ * \brief Value of shifter of CMS bitmap.
  */
-int *cmsBitMap_shifter       = NULL;
+int cmsBitMap_shifter       = 0;
 /*!
  * \brief Pointer to CMS Marking bitmap start memory address.
  */
@@ -958,7 +942,7 @@
    */
   
   return (void*)(narrowOffsetBase +
-                      ((ptrdiff_t)narrowOop << (*narrowOffsetShift)));
+                      ((ptrdiff_t)narrowOop << narrowOffsetShift));
 }
 
 /*!
@@ -975,7 +959,7 @@
    */
   
   return (void*)(narrowKlassOffsetBase +
-                      ((ptrdiff_t)narrowKlass << (*narrowKlassOffsetShift)));
+                      ((ptrdiff_t)narrowKlass << narrowKlassOffsetShift));
 }
 
 /*!
@@ -1004,33 +988,37 @@
  * \sa oopDesc::klass()<br>
  *     at hotspot/src/share/vm/oops/oop.inline.hpp in JDK.
  */
-void *getKlassOopFromOop(void *oop) {
-  
-  void *tempAddr = NULL;
+void *getKlassOopFromOop(void *oop){
+
   /* Sanity check. */
-  if (unlikely(oop == NULL)) {
+  if(unlikely(oop == NULL)){
     return NULL;
   }
-  
+
+  void *tempAddr = NULL;
+
   /* If JVM use "C"ompressed "OOP". */
-  if (*isCOOP) {
+  if(isCOOP){
     /* Get oop's klassOop from "_compressed_klass" field. */
     unsigned int* testAddr =
                       (unsigned int*)((ptrdiff_t)oop + ofsCoopKlassAtOop);
-    
+
     if (likely(testAddr != NULL)) {
       /* Decode COOP. */
       tempAddr = getWideKlass(*testAddr);
     }
-  } else {
+
+  }
+  else{
     /* Get oop's klassOop from "_klass" field. */
     void **testAddr = (void**)incAddress(oop, ofsKlassAtOop);
-    
-    if (likely(testAddr != NULL)) {
+
+    if(likely(testAddr != NULL)){
       tempAddr = (*testAddr);
     }
+
   }
-  
+
   return tempAddr;
 }
 
@@ -1125,7 +1113,7 @@
  */
 inline bool isMarkedObject(void *oop) {
   size_t idx  = (((ptrdiff_t)oop - (ptrdiff_t)cmsBitMap_startWord)
-                 >> ((unsigned)LogHeapWordSize + (unsigned)*cmsBitMap_shifter));
+                 >> ((unsigned)LogHeapWordSize + (unsigned)cmsBitMap_shifter));
   size_t mask = (size_t)1 << (idx & BitsPerWordMask);
   return (((size_t*)cmsBitMap_startAddr)[(idx >> LogBitsPerWord)] & mask) != 0;
 }
@@ -1300,13 +1288,12 @@
  * \sa CMSParRemarkTask::do_young_space_rescan()<br>
  *     ContiguousSpace::par_oop_iterate()
  */
-extern "C" void callbackForIterate(void *oop) {
-  
-  if (*useCMS) {
-    
+extern "C" void callbackForIterate(void *oop){
+
+  if(useCMS){
+
     /* If object is in CMS gen.  */
-    if ((ptrdiff_t)oop >= (ptrdiff_t)cmsBitMap_startWord) {
-      
+    if((ptrdiff_t)oop >= (ptrdiff_t)cmsBitMap_startWord){
       /* Skip. because collect object in CMS gen by callbackForSweep. */
       return;
     }
@@ -1314,7 +1301,7 @@
     /* Invoke callback by CMS GC. */
     callbackForSnapshot(cmsCallbackFunc, oop);
   }
-  else if(*useG1){
+  else if(useG1){
 
     if(checkObjectMap->checkAndMark(oop)){
       /* Object is already collected by G1GC collector. */
@@ -1325,7 +1312,7 @@
     callbackForSnapshot(gcCallbackFunc, oop);
     isInvokedParallelGC = true;
   }
-  
+
 }
 
 /*!
@@ -1557,7 +1544,9 @@
  * \return Process result.
  */
 bool searchCommonInformation(void) {
-  
+  int *narrowOffsetShiftBuf = NULL;
+  int *narrowKlassOffsetShiftBuf = NULL;
+
   /* List of common field offset. */
   TOffsetNameMap ofsMap[] = {
     {"Universe", "_collectedHeap",              NULL,
@@ -1565,11 +1554,11 @@
     {"Universe", "_narrow_oop._base",           NULL,
       (void **)&narrowOffsetBase},
     {"Universe", "_narrow_oop._shift",          NULL,
-      (void **)&narrowOffsetShift},
+      (void **)&narrowOffsetShiftBuf},
     {"Universe", "_narrow_klass._base",         NULL,
       (void **)&narrowKlassOffsetBase},
     {"Universe", "_narrow_klass._shift",        NULL,
-      (void **)&narrowKlassOffsetShift},
+      (void **)&narrowKlassOffsetShiftBuf},
     {"oopDesc",  "_metadata._klass",            &ofsKlassAtOop,
       NULL},
     {"oopDesc",  "_metadata._compressed_klass", &ofsCoopKlassAtOop,
@@ -1598,7 +1587,7 @@
   
   /* If failure getting common field offset information. */
   if (unlikely(collectedHeap == NULL || narrowOffsetBase == 0
-    || narrowOffsetShift   == NULL || ofsKlassAtOop    == -1
+    || narrowOffsetShiftBuf  == NULL || ofsKlassAtOop    == -1
     || ofsCoopKlassAtOop   == -1   || ofsNameAtKlass   == -1
     || ofsLengthAtSymbol   == -1   || ofsBodyAtSymbol  == -1)) {
     
@@ -1607,10 +1596,15 @@
     return false;
   }
 
+  narrowOffsetShift = *narrowOffsetShiftBuf;
+
   if(!jvmInfo->isAfterCR8003424()){
     narrowKlassOffsetBase = narrowOffsetBase;
     narrowKlassOffsetShift = narrowOffsetShift;
   }
+  else{
+    narrowKlassOffsetShift = *narrowKlassOffsetShiftBuf;
+  }
 
   if(!jvmInfo->isAfterCR6964458()){
     /* List of common class size. */
@@ -1660,7 +1654,7 @@
   /* Search flag symbols. */
   struct {
     const char *symbolStr;
-    bool** flagPtr;
+    bool *flagPtr;
   } flagList[] = {
 #ifdef __LP64__
     {"UseCompressedOops",  &isCOOP},
@@ -1687,7 +1681,7 @@
       return false;
     }
     
-    (*flagList[i].flagPtr) = tempPtr;
+    *(flagList[i].flagPtr) = *tempPtr;
   }
 
 #ifdef __LP64__
@@ -1705,20 +1699,20 @@
       PRINT_WARN_MSG_HEADER << target_sym << " not found." << NEWLINE;
     }
     else{
-      isCOOP = tempPtr;
+      isCOOP = *tempPtr;
     }
 
   }
 #endif
 
-  if(*isCOOP){
+  if(isCOOP){
     PRINT_DEBUG_MSG("Compressed Class = true");
   }
   else{
     PRINT_DEBUG_MSG("Compressed Class = false");
   }
 
-  if(*useG1){
+  if(useG1){
     /* Add vtable offset */
 #ifdef __LP64__
     VTableForTypeArrayOopClosure[0] =
@@ -1748,7 +1742,7 @@
   else{
 
     /* Search "is_in_permanent" function symbol. */
-    if(*useParallel || *useParOld){
+    if(useParallel || useParOld){
       is_in_permanent = (THeap_IsInPermanent)symFinder->findSymbol(
                               "_ZNK20ParallelScavengeHeap15is_in_permanentEPKv");
     }
@@ -1952,17 +1946,15 @@
   cmsCollector = *(void**)cmsCollector;
   ptrdiff_t cmsBitmapPtr = (ptrdiff_t)cmsCollector + offsetCmsMapAtCollector;
   cmsBitMap_startWord = *(void**)(cmsBitmapPtr + offsetCmsStartWord);
-  cmsBitMap_shifter   = (int*)(cmsBitmapPtr + offsetCmsShifter);
+  cmsBitMap_shifter   = *(int*)(cmsBitmapPtr + offsetCmsShifter);
   
   ptrdiff_t virtSpace = cmsBitmapPtr + offsetCmsVirtualSpace;
   cmsBitMap_startAddr = *(size_t**)(virtSpace + offsetLowAtVirtualSpace);
   
   /* If failure getting CMS bitmap information. */
-  if (unlikely(cmsBitMap_startWord == NULL || cmsBitMap_shifter == NULL
-                                         || cmsBitMap_startAddr == NULL)) {
-    
+  if(unlikely(cmsBitMap_startWord == NULL || cmsBitMap_startAddr == NULL)){
     PRINT_WARN_MSG("Failure getting information form JVM."
-      " info:CMS from:calculate");
+                   " info:CMS from:calculate");
     return false;
   }
   
@@ -2121,25 +2113,25 @@
   
   /* Setting hooking target. */
   THookFunctionInfo *list = NULL;
-  if (*useParOld) {
+  if(useParOld){
     SELECT_HOOK_FUNCS(list, parOld)
-  } else if (*useCMS) {
-    
+  }
+  else if(useCMS){
     /* Switch CMS hooking at new generation. */
     THookFunctionInfo *funcs;
     SELECT_HOOK_FUNCS(funcs, cms_new)
 
     switchOverrideFunction(funcs, enable);
-    
+
     list = cms_sweep_hook;
-  } else if (*useG1) {
-
+  }
+  else if(useG1){
     /* If users select G1, we prepare TSnapShotContainer NOW! */
     snapshotByGC = TSnapShotContainer::getInstance();
-    
+
     /* Switch G1GC event hooking. */
     switchOverrideFunction(g1Event_hook, enable);
-    
+
     SELECT_HOOK_FUNCS(list, g1)
     checkObjectMap->clear();
   }
@@ -2270,7 +2262,7 @@
     return false;
   }
   
-  if(*useG1){
+  if(useG1){
     if(unlikely(!jvmInfo->isAfterCR7046558())){
       /* Heapstats agent is unsupported G1GC on JDK6. */
       PRINT_CRIT_MSG("Sorry, G1GC isn't supported in this HotSpot version.");
@@ -2288,7 +2280,7 @@
 void oopUtilFinalize(void) {
   
   /* Cleanup. */
-  if (*useG1) {
+  if(useG1){
     delete checkObjectMap;
     checkObjectMap = NULL;
   }
@@ -2368,12 +2360,14 @@
   }
   
   /* Setup each GC type. */
-  bool result = (*useParallel);
-  if (*useParOld) {
+  bool result = useParallel;
+  if(useParOld){
     result = setupForParallelOld();
-  } else if (*useCMS) {
+  }
+  else if(useCMS){
     result = setupForCMS();
-  } else if (*useG1) {
+  }
+  else if(useG1){
     result = setupForG1GC(maxMemSize);
   }
   
--- a/agent/src/oopUtil.hpp	Mon Mar 17 19:52:20 2014 +0900
+++ b/agent/src/oopUtil.hpp	Fri Mar 28 13:40:16 2014 +0900
@@ -1,7 +1,7 @@
 /*!
  * \file oopUtil.hpp
  * \brief This file is used to getting information inner JVM.<br>
- * Copyright (C) 2011-2013 Nippon Telegraph and Telephone Corporation
+ * Copyright (C) 2011-2014 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
@@ -165,29 +165,29 @@
 /* Define JVM paramter pointer variable for calling from external. */
 
 /*!
- * \brief Pointer to "-XX:UseCompressedOops" or "-XX:UseCompressedKlassPointers".
+ * \brief Value of "-XX:UseCompressedOops" or "-XX:UseCompressedKlassPointers".
  */
-extern "C" bool *isCOOP;
+extern "C" bool isCOOP;
 
 /*!
- * \brief Pointer to "-XX:UseParallelGC".
+ * \brief Value of "-XX:UseParallelGC".
  */
-extern "C" bool *useParallel;
+extern "C" bool useParallel;
 
 /*!
- * \brief Pointer to "-XX:UseParallelOldGC".
+ * \brief Value of "-XX:UseParallelOldGC".
  */
-extern "C" bool *useParOld;
+extern "C" bool useParOld;
 
 /*!
- * \brief Pointer to "-XX:UseConcMarkSweepGC".
+ * \brief Value of "-XX:UseConcMarkSweepGC".
  */
-extern "C" bool *useCMS;
+extern "C" bool useCMS;
 
 /*!
- * \brief Pointer to"-XX:UseG1GC".
+ * \brief Value of "-XX:UseG1GC".
  */
-extern "C" bool *useG1;
+extern "C" bool useG1;
 
 /*!
  * \brief JVM safepoint state pointer.
--- a/agent/src/snapShotMain.cpp	Mon Mar 17 19:52:20 2014 +0900
+++ b/agent/src/snapShotMain.cpp	Fri Mar 28 13:40:16 2014 +0900
@@ -655,7 +655,7 @@
  */
 void onVMDeathForSnapShot(jvmtiEnv *jvmti, JNIEnv *env) {
   
-  if (*useCMS) {
+  if(useCMS){
     /* Get CMS state. */
     bool needShapShot = false;
     checkCMSState(gcLast, &needShapShot);