Sau đây là dựa trên câu trả lời của Peter Dolberg và có thể được sử dụng trong VisualVM OQL Console:
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;
}
}
);
Nó bắt đầu bằng cách sử dụng một cuộc gọi map()
trên tất cả các trường String và cho mỗi chuỗi tạo hoặc cập nhật đối tượng trong mảng counts
. Mỗi đối tượng có một trường string
và trường count
.
Mảng kết quả sẽ chứa một mục nhập cho mỗi thể hiện String, mỗi giá trị có giá trị count
lớn hơn mục nhập trước đó cho cùng một Chuỗi. Kết quả là sau đó được sắp xếp trên các lĩnh vực count
và kết quả trông giống như sau:
{
count = 1028.0,
string = *null*
}
{
count = 1027.0,
string = *null*
}
{
count = 1026.0,
string = *null*
}
...
(trong thử nghiệm của tôi String "*null*"
là phổ biến nhất).
Bước cuối cùng là lọc bộ lọc này bằng hàm trả về true cho lần xuất hiện đầu tiên của mỗi chuỗi. Nó sử dụng mảng alreadyReturned
để theo dõi chuỗi nào đã được bao gồm.
Nguồn
2012-02-27 18:00:40
Cảm ơn bạn đã giải quyết được vấn đề. Các oql là bằng cách nào đó khó xử để sử dụng. Tất cả phải xảy ra trong một chức năng ... – paweloque
wow, không biết rằng jvisualvm là mạnh mẽ. Tôi tìm thấy giá trị đếm cao cho một số Strings - không mã của bạn loại trừ rác thải (không tham chiếu Strings)? – Jan
Nó sử dụng "heap.objects" để tìm tất cả các đối tượng java.lang.String trên heap. Không có bộ lọc để loại trừ các chuỗi không tham chiếu. Nhưng tùy thuộc vào cách đống kết xuất được tạo ra, JVM có thể đã thực hiện một GC đầy đủ trước đó, trong trường hợp này, bất kỳ chuỗi không tham chiếu nào đã bị loại bỏ và không được bao gồm trong vùng chứa đống. –