2010-09-21 12 views
7

क्या वर्तमान जावा एप्लिकेशन प्रोग्रामेटिक रूप से शीर्ष प्रयुक्त एन कक्षाओं को मुद्रित करने का कोई तरीका है?प्रिंटिंग क्लास हिस्टोग्राम प्रोग्रामेटिक

नमूना उत्पादन: एन = 10

num #instances #bytes class name 
-------------------------------------- 
    1:  23  4723136 [I 
    2:  19  4718928 [J 
    3:  18  4718880 [D 
    4:  73925  1774200 java.lang.String 
    5:  208  1226400 [C 
    6:  28  1205064 [B 
    7:  18  1179936 [F 
    8:  68  297040 [Ljava.lang.String; 
    9:  332  14136 [Ljava.lang.Object; 
10:  32  10240 <objArrayKlassKlass> 
+0

नेटबीन्स प्रोफाइलर यह अच्छी तरह से करता है, नेटबीन्स जावा में लिखा गया है, इसलिए ... हाँ एक तरीका है =) यहां आप जाओ! – BenoitParis

+0

"शीर्ष उपयोग" से आपका क्या मतलब है? किसी भी समय दिए गए बिंदु पर या आवेदन जीवन भर में कुल मिलाकर उदाहरणों की सबसे बड़ी संख्या वाले वर्ग? या हो सकता है कि आप उन वर्गों का अर्थ लें जिनकी विधियों का सबसे अधिक उपयोग किया जाता है? (समय आधारित माप या आविष्कार गणना माप) –

+0

[जे? [मैं पूर्णांक की सरणी है, लेकिन जे? –

उत्तर

0

शायद नहीं JVM Tool Interface (JVM TI) से गुजर रही या वस्तु के कार्यान्वयन (जो एक मुश्किल काम है) के साथ छेड़छाड़ के बिना।

यह आलेख शायद उपयोगी है: Creating a Debugging and Profiling Agent with JVMTI

+0

टिप्पणियों के लिए धन्यवाद। मुझे लगता है कि जेएमएपी स्रोत का उपयोग करना अच्छा विकल्प हो सकता है .. यह लाइव पर्यावरण पर जोखिम भरा है .. http://www.java2s.com/Open-Source/Java-Document/6.0-JDK- मॉड्यूल-sun/tools/sun/tools /jmap/JMap.java.htm – Trustin

0

यदि आपका मतलब सबसे ऊपर उपयोग किया जाता है, तो कक्षाएं जो सबसे अधिक शुरू होती हैं, आप रचनाकारों के चारों ओर एक पॉइंटकट परिभाषित कर सकते हैं और प्रत्येक प्रकार के प्रारंभिकरणों का ट्रैक रख सकते हैं। आप उस मामले के लिए AspectJ का उपयोग कर सकते हैं।

+0

मैं अपने कार्यक्रम को बदलने के बिना jmap -histo [: live] pid के साथ एक ही काम करना चाहता हूं। क्योंकि प्रणाली लाइव है। मैं इस तरह के बिंदु कट जोड़कर ओवरहेड जोड़ना नहीं चाहता हूं। इसलिए मैं गिनती घटाने के लिए फिनिलाइज़र विधि पर भरोसा नहीं कर सकता। – Trustin

+0

ताकि आप किसी दिए गए बिंदु पर उदाहरणों की संख्या देखना चाहते हैं, मैंने सोचा था कि आप बनाए गए उदाहरणों की कुल संख्या देखना चाहते हैं। तब मुझे लगता है कि आपको एक प्रोफाइलिंग एपीआई चाहिए। आप java.lang.management पैकेज देख सकते हैं लेकिन मुझे यकीन नहीं है कि इंस्टेंस गणना प्राप्त करना संभव है या नहीं – hakan

0

मुझे नहीं लगता कि आप इसे उसी JVM में कर सकते हैं क्योंकि आपको ऑब्जेक्ट ढेर को पार करने की आवश्यकता है, और आप अनंत लूप में जा सकते हैं। जिज्ञासा से बाहर, मैंने को उसी जेवीएम के खिलाफ Runtime.exec का उपयोग करके और एक अलग जेवीएम के खिलाफ भी कोशिश की और यह बस लटक गया?

String pid = ManagementFactory.getRuntimeMXBean().getName().split("@")[0]; 
//pid=2520 
System.out.println("PID: " + pid); 
Process p = Runtime.getRuntime().exec("jmap -histo " + pid); 
p.waitFor(); 
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream())); 
String line ; 
while((line = br.readLine())!=null){ 
    System.out.println(line); 
} 

br = new BufferedReader(new InputStreamReader(p.getErrorStream())); 
while((line = br.readLine())!=null){ 
    System.out.println(line); 
} 
3

आप अपने जावा आवरण स्क्रिप्ट के हिस्से के रूप jmap शुरू और एक पाश में लगातार यह पड़ सकते है:

java MyMainClass ... & 

pid=$! 
while [ ! -z $pid ] 
do 
    jmap -histo $pid | head -13 
    sleep 60 

    #check pid 
    kill -0 $pid > /dev/null 2>&1 
    if [ $? -ne 0 ] 
    then 
     pid="" 
    fi 
done 
:

उदाहरण के लिए, यदि आप यूनिक्स पर कर रहे हैं, आप की तरह कुछ कर सकता है

संबंधित मुद्दे