changeset 19:ac44c043b016

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:20 +0900
parents 9c57b65d193b
children 6e3347ac6aab
files agent/ChangeLog agent/src/libmain.cpp agent/src/oopUtil.cpp agent/src/oopUtil.hpp agent/src/snapShotMain.cpp
diffstat 5 files changed, 140 insertions(+), 148 deletions(-) [+]
line wrap: on
line diff
--- a/agent/ChangeLog	Fri Mar 28 13:28:38 2014 +0900
+++ b/agent/ChangeLog	Fri Mar 28 13:40:20 2014 +0900
@@ -1,6 +1,7 @@
 2014-03-28  Yasumasa Suenaga  <suenaga.yasumasa@lab.ntt.co.jp>
 
 	* Bug 1716: Reduce getObjectSize() call.
+	* Bug 1717: Reduce memory load operation.
 	* Bug 1718: Reduce CPU cycles for child oop traversal.
 
 2014-03-17  Yasumasa Suenaga  <suenaga.yasumasa@lab.ntt.co.jp>
--- a/agent/src/libmain.cpp	Fri Mar 28 13:28:38 2014 +0900
+++ b/agent/src/libmain.cpp	Fri Mar 28 13:40:20 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
@@ -477,12 +477,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	Fri Mar 28 13:28:38 2014 +0900
+++ b/agent/src/oopUtil.cpp	Fri Mar 28 13:40:20 2014 +0900
@@ -171,48 +171,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;
 
 
 /*!
@@ -364,9 +348,9 @@
 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 base address.
@@ -374,9 +358,9 @@
 ptrdiff_t narrowKlassOffsetBase = 0;
 
 /*!
-* \brief Pointer of Klass COOP shift bits.
+* \brief Value of Klass COOP shift bits.
  */
-int *narrowKlassOffsetShift     = &dummyZeroInt;
+int narrowKlassOffsetShift     = 0;
 
 /*!
  * \brief Lock bit mask.<br>
@@ -391,9 +375,9 @@
  */
 void *cmsBitMap_startWord    = NULL;
 /*!
- * \brief Pointer to shifter of CMS bitmap.
+ * \brief Value of CMS bitmap shifter.
  */
-int *cmsBitMap_shifter       = NULL;
+int cmsBitMap_shifter       = 0;
 /*!
  * \brief Pointer to CMS Marking bitmap start memory address.
  */
@@ -1200,7 +1184,7 @@
      */
     
     return (void*)(narrowOffsetBase +
-        ((ptrdiff_t)narrowOop << (*narrowOffsetShift)));
+        ((ptrdiff_t)narrowOop << narrowOffsetShift));
 }
 
 /*!
@@ -1217,7 +1201,7 @@
      */
     
     return (void*)(narrowKlassOffsetBase +
-        ((ptrdiff_t)narrowKlass << (*narrowKlassOffsetShift)));
+        ((ptrdiff_t)narrowKlass << narrowKlassOffsetShift));
 }
 
 /*!
@@ -1239,34 +1223,37 @@
  * \sa oopDesc::klass()<br>
  *     at hotspot/src/share/vm/oops/oop.inline.hpp in JDK.
  */
-void *getKlassOopFromOop(void *oop) {
-    
-    void *tempAddr = NULL;
-    /* Sanity check. */
-    if (unlikely(oop == NULL)) {
-        return NULL;
+void *getKlassOopFromOop(void *oop){
+
+  /* Sanity check. */
+  if (unlikely(oop == NULL)) {
+      return NULL;
+  }
+
+  void *tempAddr = NULL;
+
+  /* If JVM use "C"ompressed "OOP". */
+  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);
     }
-    
-    /* If JVM use "C"ompressed "OOP". */
-    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 {
-        /* Get oop's klassOop from "_klass" field. */
-        void **testAddr = (void**)incAddress(oop, ofsKlassAtOop);
-        
-        if (likely(testAddr != NULL)) {
-            tempAddr = (*testAddr);
-        }
+
+  }
+  else{
+    /* Get oop's klassOop from "_klass" field. */
+    void **testAddr = (void**)incAddress(oop, ofsKlassAtOop);
+
+    if(likely(testAddr != NULL)){
+      tempAddr = (*testAddr);
     }
-    
-    return tempAddr;
+
+  }
+
+  return tempAddr;
 }
 
 /*!
@@ -1360,7 +1347,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;
 }
@@ -1606,7 +1593,7 @@
         }
         
         /* Get child oop and move next array item. */
-        if (*isCOOP) {
+        if (isCOOP) {
             
             /* If this field is not null. */
             if (likely((*(unsigned int*)fieldOops) != 0)) {
@@ -1696,8 +1683,8 @@
                  * Please see below source file about detail implementation.
                  * hostpost/src/share/vm/oops/arrayOop.hpp
                  */
-                block->count  = (*isCOOP) ? (ofsKlassAtOop + clsSizeNarrowOop)
-                    : clsSizeArrayOopDesc;
+                block->count  = isCOOP ? (ofsKlassAtOop + clsSizeNarrowOop)
+                                       : clsSizeArrayOopDesc;
                 block->offset =
                     ALIGN_SIZE_UP(block->count + sizeof(int), HeapWordSize);
                 
@@ -1829,30 +1816,30 @@
  *     ContiguousSpace::par_oop_iterate()
  */
 extern "C" void callbackForIterate(void *oop) {
-    
-    if (*useCMS) {
-        
-        /* If object is in CMS gen.  */
-        if ((ptrdiff_t)oop >= (ptrdiff_t)cmsBitMap_startWord) {
-            
-            /* Skip. because collect object in CMS gen by callbackForSweep. */
-            return;
-        }
-        
-        /* Invoke callback by CMS GC. */
-        cmsCallbackFunc(oop, NULL);
-    } else if (*useG1) {
-        
-        if (checkObjectMap->checkAndMark(oop)) {
-            
-            /* Object is already collected by G1GC collector. */
-            return;
-        }
-        
-        /* Invoke callback by GC. */
-        gcCallbackFunc(oop, NULL);
-        isInvokedParallelGC = true;
+
+  if(useCMS){
+
+    /* If object is in CMS gen.  */
+    if((ptrdiff_t)oop >= (ptrdiff_t)cmsBitMap_startWord){
+      /* Skip. because collect object in CMS gen by callbackForSweep. */
+      return;
     }
+
+    /* Invoke callback by CMS GC. */
+    cmsCallbackFunc(oop, NULL);
+  }
+  else if(useG1){
+
+    if(checkObjectMap->checkAndMark(oop)){
+      /* Object is already collected by G1GC collector. */
+      return;
+    }
+
+    /* Invoke callback by GC. */
+    gcCallbackFunc(oop, NULL);
+    isInvokedParallelGC = true;
+  }
+
 }
 
 /*!
@@ -2066,7 +2053,9 @@
  * \return Process result.
  */
 bool searchCommonInformation(void) {
-    
+    int *narrowOffsetShiftBuf = NULL;
+    int *narrowKlassOffsetShiftBuf = NULL;
+
     /* List of common field offset. */
     TOffsetNameMap ofsMap[] = {
         {"Universe", "_collectedHeap",
@@ -2074,11 +2063,11 @@
         {"Universe", "_narrow_oop._base",
             NULL,               (void **)&narrowOffsetBase},
         {"Universe", "_narrow_oop._shift",
-            NULL,               (void **)&narrowOffsetShift},
+            NULL,               (void **)&narrowOffsetShiftBuf},
         {"Universe", "_narrow_klass._base",
             NULL,               (void **)&narrowKlassOffsetBase},
         {"Universe", "_narrow_klass._shift",
-            NULL,               (void **)&narrowKlassOffsetShift},
+            NULL,               (void **)&narrowKlassOffsetShiftBuf},
         {"oopDesc",  "_metadata._klass",
             &ofsKlassAtOop,     NULL},
         {"oopDesc",  "_metadata._compressed_klass",
@@ -2124,7 +2113,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
         || ofsVTableSizeAtInsKlass == -1   || ofsITableSizeAtInsKlass == -1
@@ -2136,11 +2125,16 @@
         return false;
     }
 
+    narrowOffsetShift = *narrowOffsetShiftBuf;
+
     if(!enableCR8003424){
       narrowKlassOffsetBase = narrowOffsetBase;
       narrowKlassOffsetShift = narrowOffsetShift;
     }
-    
+    else{
+      narrowKlassOffsetShift = *narrowKlassOffsetShiftBuf;
+    }
+
     /* List of common class size. */
     TTypeSizeMap typeMap[] = {
         /*
@@ -2208,7 +2202,7 @@
     /* Search flag symbols. */
     struct {
         const char *symbolStr;
-        bool** flagPtr;
+        bool *flagPtr;
     } flagList[] = {
 #ifdef __LP64__
         {"UseCompressedOops",  &isCOOP},
@@ -2234,7 +2228,7 @@
             return false;
         }
         
-        (*flagList[i].flagPtr) = tempPtr;
+        *(flagList[i].flagPtr) = *tempPtr;
     }
 
 #ifdef __LP64__
@@ -2252,20 +2246,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] =
@@ -2326,7 +2320,7 @@
         
         /* Perm gen isn't exists. */
         is_in_permanent = (THeap_IsInPermanent)&dummyIsInPermanent;
-    } else if ((*useParallel) || (*useParOld)) {
+    } else if (useParallel || useParOld){
         
         is_in_permanent = (THeap_IsInPermanent)symFinder->findSymbol(
             IS_IN_PERM_ON_PARALLEL_GC_SYMBOL);
@@ -2529,18 +2523,16 @@
     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)) {
-        
-        PRINT_WARN_MSG("Failure getting information form JVM."
-            " info:CMS from:calculate");
-        return false;
+    if(unlikely((cmsBitMap_startWord == NULL) || (cmsBitMap_startAddr == NULL))){
+      PRINT_WARN_MSG("Failure getting information form JVM."
+                     " info:CMS from:calculate");
+      return false;
     }
     
     /* Search symbol for CMS state. */
@@ -2651,26 +2643,23 @@
     
     /* Setting hooking target. */
     THookFunctionInfo *list = NULL;
-    if (*useParOld) {
-        
-        list = parOld_hook;
-        
-    } else if (*useCMS) {
-        
-        /* Switch CMS hooking at new generation. */
-        switchOverrideFunction(cms_new_hook, enable);
-        
-        list = cms_sweep_hook;
-    } else if (*useG1) {
+    if(useParOld){
+      list = parOld_hook;
+    }
+    else if(useCMS){
+      /* Switch CMS hooking at new generation. */
+      switchOverrideFunction(cms_new_hook, enable);
+      list = cms_sweep_hook;
+    }
+    else if(useG1){
+      /* If users select G1, we prepare TSnapShotContainer NOW! */
+      snapshotByGC = TSnapShotContainer::getInstance();
 
-        /* If users select G1, we prepare TSnapShotContainer NOW! */
-        snapshotByGC = TSnapShotContainer::getInstance();
+      /* Switch G1GC event hooking. */
+      switchOverrideFunction(g1Event_hook, enable);
 
-        /* Switch G1GC event hooking. */
-        switchOverrideFunction(g1Event_hook, enable);
-        
-        list = g1_hook;
-        checkObjectMap->clear();
+      list = g1_hook;
+      checkObjectMap->clear();
     }
     
     /* Switch common hooking. */
@@ -2836,7 +2825,7 @@
          * http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7046558
          * http://hg.openjdk.java.net/hsx/hotspot-gc/hotspot/rev/842b840e67db
          */
-        if ((*useG1)) {
+        if(useG1){
             const unsigned int afterCR7046558 = 22 << 24 | 3;
             
             if (unlikely(hotSpotVersion < afterCR7046558)) {
@@ -2880,9 +2869,9 @@
 void oopUtilFinalize(void) {
     
     /* Cleanup. */
-    if (*useG1) {
-        delete checkObjectMap;
-        checkObjectMap = NULL;
+    if(useG1){
+      delete checkObjectMap;
+      checkObjectMap = NULL;
     }
     
     delete vmScanner;
@@ -2963,13 +2952,15 @@
     }
     
     /* Setup each GC type. */
-    bool result = (*useParallel);
-    if (*useParOld) {
-        result = setupForParallelOld();
-    } else if (*useCMS) {
-        result = setupForCMS();
-    } else if (*useG1) {
-        result = setupForG1GC(maxMemSize);
+    bool result = useParallel;
+    if(useParOld){
+      result = setupForParallelOld();
+    }
+    else if(useCMS){
+      result = setupForCMS();
+    }
+    else if(useG1){
+      result = setupForG1GC(maxMemSize);
     }
     
     return result;
--- a/agent/src/oopUtil.hpp	Fri Mar 28 13:28:38 2014 +0900
+++ b/agent/src/oopUtil.hpp	Fri Mar 28 13:40:20 2014 +0900
@@ -193,29 +193,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:UseCompressedClassPointers".
  */
-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	Fri Mar 28 13:28:38 2014 +0900
+++ b/agent/src/snapShotMain.cpp	Fri Mar 28 13:40:20 2014 +0900
@@ -873,7 +873,7 @@
  */
 void onVMDeathForSnapShot(jvmtiEnv *jvmti, JNIEnv *env) {
     
-    if (*useCMS) {
+    if(useCMS){
         
         /* Disable inner GC event. */
         setupHookForInnerGCEvent(false, NULL);