# HG changeset patch # User Yasumasa Suenaga # Date 1395981616 -32400 # Node ID a4b4008e4ec0f94952572dd371b5d39f465090bd # Parent 48dc7c3ceee5fe136006f354a3e2776f2b2ee746 Bug 1717: Reduce memory load operation. reviewed-by: ykubota diff -r 48dc7c3ceee5 -r a4b4008e4ec0 agent/ChangeLog --- 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 + + * Bug 1717: Reduce memory load operation. + 2014-03-17 Yasumasa Suenaga * Bug 1647: Full mode log archiving does not work when using fifo pipe for gc log diff -r 48dc7c3ceee5 -r a4b4008e4ec0 agent/src/libmain.cpp --- 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.
* 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; } diff -r 48dc7c3ceee5 -r a4b4008e4ec0 agent/src/oopUtil.cpp --- 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.
- * 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.
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; /*! * \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()
* 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()
* 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); } diff -r 48dc7c3ceee5 -r a4b4008e4ec0 agent/src/oopUtil.hpp --- 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.
- * 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. diff -r 48dc7c3ceee5 -r a4b4008e4ec0 agent/src/snapShotMain.cpp --- 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);