bazuje na odpowiedź Petera Dolberg i może być używany w VisualVM OQL konsoli następujące:
var counts={};
var alreadyReturned={};
filter(
sort(
map(heap.objects("java.lang.String"),
function(heapString){
if(! counts[heapString.toString()]){
counts[heapString.toString()] = 1;
} else {
counts[heapString.toString()] = counts[heapString.toString()] + 1;
}
return { string:heapString.toString(), count:counts[heapString.toString()]};
}),
'lhs.count < rhs.count'),
function(countObject) {
if(! alreadyReturned[countObject.string]){
alreadyReturned[countObject.string] = true;
return true;
} else {
return false;
}
}
);
Zaczyna stosując map()
wezwanie na wszystkich przypadkach Smyczkowych i dla każdej struny tworzenia lub aktualizacji obiekt w tablicy counts
. Każdy obiekt ma pole string
i count
.
Wynikowa tablica będzie zawierała jeden wpis dla każdej instancji String, z których każda ma wartość o jeden większą niż poprzednia pozycja dla tego samego ciągu znaków. Wynik jest następnie sortowane na polu count
i wynik wygląda mniej więcej tak:
{
count = 1028.0,
string = *null*
}
{
count = 1027.0,
string = *null*
}
{
count = 1026.0,
string = *null*
}
...
(w moim teście String "*null*"
był najczęściej).
Ostatnim krokiem jest filtrowanie tego przy użyciu funkcji, która zwraca wartość true dla pierwszego wystąpienia każdego ciągu. Korzysta z tablicy alreadyReturned
, aby śledzić, które łańcuchy zostały już dołączone.
Dzięki, że ładnie rozwiązuje problem. Oql jest jakoś niewygodny w użyciu. Wszystko musi się zdarzyć w jednej funkcji ... – paweloque
wow, nie wiedziałem, że jvisualvm jest tak potężny. Znalazłem wysokie wartości liczników dla niektórych Ciągów - czy twój kod wyklucza śmieci (nie odnoszące się do Ciągów)? – Jan
Używa "heap.objects" do znalezienia wszystkich obiektów java.lang.String na stercie. Nie ma filtrowania, aby wykluczyć niezwiązane łańcuchy. Ale w zależności od sposobu generowania zrzutu sterty JVM mogło wykonać pełny GC przed, w którym to przypadku wszelkie niezwiązane łańcuchy powinny już zostać usunięte i nie zostały uwzględnione w zrzucie sterty. –