# HG changeset patch # User Yasumasa Suenaga # Date 1395981620 -32400 # Node ID ac44c043b016f413c6b46e860df1a91e26872765 # Parent 9c57b65d193b3ccfb7daa573c6e92ef29a559564 Bug 1717: Reduce memory load operation. reviewed-by: ykubota diff -r 9c57b65d193b -r ac44c043b016 agent/ChangeLog --- 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 * 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 diff -r 9c57b65d193b -r ac44c043b016 agent/src/libmain.cpp --- 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.
* 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; } diff -r 9c57b65d193b -r ac44c043b016 agent/src/oopUtil.cpp --- 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.
This variable is always 0. - */ -int dummyZeroInt = 0; - -/*! - * \brief Dummy false flag.
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.
@@ -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()
* 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; diff -r 9c57b65d193b -r ac44c043b016 agent/src/oopUtil.hpp --- 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. diff -r 9c57b65d193b -r ac44c043b016 agent/src/snapShotMain.cpp --- 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);