निम्नलिखित पीटर Dolberg द्वारा जवाब पर आधारित है और VisualVM OQL कंसोल में इस्तेमाल किया जा सकता:
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;
}
}
);
यह बना कर या किसी को अद्यतन करने के सभी स्ट्रिंग उदाहरणों पर और प्रत्येक स्ट्रिंग के लिए एक map()
कॉल का उपयोग करके शुरू होता है counts
सरणी में ऑब्जेक्ट। प्रत्येक ऑब्जेक्ट में string
और count
फ़ील्ड है।
परिणामी सरणी में प्रत्येक स्ट्रिंग आवृत्ति के लिए एक प्रविष्टि होगी, प्रत्येक में count
एक ही स्ट्रिंग के लिए पिछली प्रविष्टि की तुलना में एक बड़ा मान होगा। परिणाम तो count
मैदान पर क्रमबद्ध किया जाता है और परिणाम कुछ इस तरह दिखता है:
{
count = 1028.0,
string = *null*
}
{
count = 1027.0,
string = *null*
}
{
count = 1026.0,
string = *null*
}
...
(अपने परीक्षण में स्ट्रिंग "*null*"
सबसे आम था)।
अंतिम चरण यह एक फ़ंक्शन का उपयोग करके फ़िल्टर करना है जो प्रत्येक स्ट्रिंग की पहली घटना के लिए सत्य लौटाता है। यह ट्रैक रखने के लिए alreadyReturned
सरणी का उपयोग करता है कि कौन से स्ट्रिंग्स को पहले से ही शामिल किया जा चुका है।
स्रोत
2012-02-27 18:00:40
धन्यवाद जो अच्छी तरह से समस्या हल करता है। ओक्यूएल किसी भी तरह का उपयोग करने के लिए अजीब है। यह सब एक समारोह में होना है ... – paweloque
वाह, यह नहीं पता था कि jvisualvm वह शक्तिशाली है। मुझे कुछ स्ट्रिंग्स के लिए उच्च गिनती मान मिलते हैं - क्या आपका कोड कचरा छोड़ देता है (संदर्भित स्ट्रिंग्स नहीं)? – Jan
यह सभी java.lang.String वस्तुओं को ढेर पर खोजने के लिए "heap.objects" का उपयोग करता है। गैर-संदर्भित स्ट्रिंग को बाहर करने के लिए कोई फ़िल्टरिंग नहीं है। लेकिन हेप डंप कैसे उत्पन्न हुआ था, इस पर निर्भर करता है कि जेवीएम ने पहले एक पूर्ण जीसी किया होगा, इस मामले में किसी भी गैर-संदर्भित स्ट्रिंग को पहले ही हटा दिया जाना चाहिए और ढेर डंप में शामिल नहीं होना चाहिए। –