Mercurial > hg > release > heapstats-1.1
changeset 18:9c57b65d193b
Bug 1718: Reduce CPU cycles for child oop traversal.
reviewed-by: ykubota
author | Yasumasa Suenaga <suenaga.yasumasa@lab.ntt.co.jp> |
---|---|
date | Fri, 28 Mar 2014 13:28:38 +0900 |
parents | bfde41acb148 |
children | ac44c043b016 |
files | agent/ChangeLog agent/src/snapShotContainer.hpp agent/src/snapShotMain.cpp |
diffstat | 3 files changed, 28 insertions(+), 32 deletions(-) [+] |
line wrap: on
line diff
--- a/agent/ChangeLog Fri Mar 28 13:15:27 2014 +0900 +++ b/agent/ChangeLog Fri Mar 28 13:28:38 2014 +0900 @@ -1,6 +1,7 @@ 2014-03-28 Yasumasa Suenaga <suenaga.yasumasa@lab.ntt.co.jp> * Bug 1716: Reduce getObjectSize() call. + * Bug 1718: Reduce CPU cycles for child oop traversal. 2014-03-17 Yasumasa Suenaga <suenaga.yasumasa@lab.ntt.co.jp>
--- a/agent/src/snapShotContainer.hpp Fri Mar 28 13:15:27 2014 +0900 +++ b/agent/src/snapShotContainer.hpp Fri Mar 28 13:28:38 2014 +0900 @@ -332,12 +332,21 @@ TChildClassCounter *prevCounter = NULL; TChildClassCounter *morePrevCounter = NULL; TChildClassCounter *counter = clsCounter->child; + + if(counter == NULL){ + return NULL; + } + /* Search children class list. */ - while (counter != NULL && counter->objData->klassOop != klassOop){ - + while(counter->objData->klassOop != klassOop){ morePrevCounter = prevCounter; prevCounter = counter; counter = counter->next; + + if(counter == NULL){ + return NULL; + } + } /* LFU (Least Frequently Used). */
--- a/agent/src/snapShotMain.cpp Fri Mar 28 13:15:27 2014 +0900 +++ b/agent/src/snapShotMain.cpp Fri Mar 28 13:28:38 2014 +0900 @@ -397,23 +397,16 @@ TChildClassCounter *clsCounter = NULL; - /* Lock class counter. */ - spinLockWait(&parentCounter->spinlock); - { - /* Search child class. */ - clsCounter = localSnapshot->findChildClass(parentCounter, klassOop); + /* Search child class. */ + clsCounter = localSnapshot->findChildClass(parentCounter, klassOop); - if(unlikely(clsCounter == NULL)){ - /* Get child class information. */ - TObjectData *clsData = getObjectDataFromKlassOop( - localClsContainer, klassOop); - /* Push new child loaded class. */ - clsCounter = localSnapshot->pushNewChildClass(parentCounter, clsData); - } - + if(unlikely(clsCounter == NULL)){ + /* Get child class information. */ + TObjectData *clsData = getObjectDataFromKlassOop( + localClsContainer, klassOop); + /* Push new child loaded class. */ + clsCounter = localSnapshot->pushNewChildClass(parentCounter, clsData); } - /* Unlock class counter. */ - spinLockRelease(&parentCounter->spinlock); if(unlikely(clsCounter == NULL)){ PRINT_CRIT_MSG("Couldn't get class counter!"); @@ -519,23 +512,16 @@ TOopMapBlock *offsets = NULL; int offsetCount = 0; - /* Lock class counter. */ - spinLockWait(&clsCounter->spinlock); - { - offsets = clsCounter->offsets; - offsetCount = clsCounter->offsetCount; + offsets = clsCounter->offsets; + offsetCount = clsCounter->offsetCount; - /* If offset list is unused yet. */ - if(unlikely(offsets == NULL && offsetCount < 0)){ - /* Generate offset list. */ - generateIterateFieldOffsets(klassOop, oopType, &offsets, &offsetCount); - clsCounter->offsets = offsets; - clsCounter->offsetCount = offsetCount; - } - + /* If offset list is unused yet. */ + if(unlikely(offsets == NULL && offsetCount < 0)){ + /* Generate offset list. */ + generateIterateFieldOffsets(klassOop, oopType, &offsets, &offsetCount); + clsCounter->offsets = offsets; + clsCounter->offsetCount = offsetCount; } - /* Unlock class counter. */ - spinLockRelease(&clsCounter->spinlock); /* Iterate non-static field objects. */ iterateFieldObject(&iterateFieldObjectCallBack, oop, oopType,