Skip to content

Commit aa740db

Browse files
committed
GH-360 display number of elements for ConcurrentHashMap
1 parent 9813210 commit aa740db

File tree

1 file changed

+32
-1
lines changed
  • visualvm/libs.profiler/profiler.heapwalker/src/org/graalvm/visualvm/lib/profiler/heapwalk/details/jdk

1 file changed

+32
-1
lines changed

visualvm/libs.profiler/profiler.heapwalker/src/org/graalvm/visualvm/lib/profiler/heapwalk/details/jdk/UtilDetailsProvider.java

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ public final class UtilDetailsProvider extends DetailsProvider.Basic {
7878
private static final String SYN_MAP_MASK = "java.util.Collections$SynchronizedMap+"; // NOI18N
7979
private static final String DEQUE_MASK = "java.util.ArrayDeque+"; // NOI18N
8080
private static final String ENUM_SET_MASK = "java.util.RegularEnumSet"; // NOI18N
81+
private static final String CONCURRENT_MAP_MASK = "java.util.concurrent.ConcurrentHashMap"; // NOI18N
8182

8283
private Formatter formatter = new SimpleFormatter();
8384

@@ -89,7 +90,8 @@ public UtilDetailsProvider() {
8990
UNMOD_COLLECTION_MASK, UNMOD_MAP_MASK, ARRAYS_LIST_MASK,
9091
EMPTY_LIST_MASK, EMPTY_MAP_MASK, EMPTY_SET_MASK,
9192
SINGLETON_LIST_MASK, SINGLETON_MAP_MASK, SINGLETON_SET_MASK,
92-
SYN_COLLECTION_MASK, SYN_MAP_MASK, DEQUE_MASK, ENUM_SET_MASK);
93+
SYN_COLLECTION_MASK, SYN_MAP_MASK, DEQUE_MASK, ENUM_SET_MASK,
94+
CONCURRENT_MAP_MASK);
9395
}
9496

9597
public String getDetailsString(String className, Instance instance) {
@@ -191,6 +193,13 @@ public String getDetailsString(String className, Instance instance) {
191193
if (elements instanceof Long) {
192194
return getElementsString(Long.bitCount((Long)elements));
193195
}
196+
} else if (CONCURRENT_MAP_MASK.equals(className)) {
197+
long baseCount = DetailsUtils.getLongFieldValue(instance, "baseCount", -1); // NOI18N
198+
ObjectArrayInstance counterCells = (ObjectArrayInstance)instance.getValueOfField("counterCells"); // NOI18N
199+
200+
if (baseCount != -1) {
201+
return getElementsString(getConcurrentMapSize(baseCount, counterCells));
202+
}
194203
}
195204
return null;
196205
}
@@ -204,6 +213,28 @@ private static String getElementsString(int length) {
204213
Bundle.UtilDetailsProvider_ItemsNumberString(length);
205214
}
206215

216+
private int getConcurrentMapSize(long baseCount, ObjectArrayInstance counterCells) {
217+
long n = getConcurrentMapSumCount(baseCount, counterCells);
218+
return ((n < 0L) ? 0 :
219+
(n > (long)Integer.MAX_VALUE) ? Integer.MAX_VALUE :
220+
(int)n);
221+
}
222+
223+
private long getConcurrentMapSumCount(long baseCount, ObjectArrayInstance counterCells) {
224+
long sum = baseCount;
225+
226+
if (counterCells != null) {
227+
List<Instance> as = counterCells.getValues();
228+
Instance a;
229+
230+
for (int i = 0; i < as.size(); ++i) {
231+
if ((a = as.get(i)) != null)
232+
sum += DetailsUtils.getLongFieldValue(a, "value", 0); // NOI18N
233+
}
234+
}
235+
return sum;
236+
}
237+
207238
private static class DetailsLogRecord extends LogRecord {
208239
private final Instance record;
209240

0 commit comments

Comments
 (0)