2010-09-21 8 views
7

có cách nào để in các lớp N được sử dụng hàng đầu trên ứng dụng java hiện tại theo chương trình không?In biểu đồ lớp học theo lập trình

sản lượng mẫu: N = 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

Netbeans profiler làm điều đó độc đáo, Netbeans được viết bằng Java, vì vậy ... Có có một cách =) Ở đây bạn đi! – BenoitParis

+0

Bạn có ý nghĩa gì với "được sử dụng hàng đầu"? Các lớp học có số lượng bản sao lớn nhất tại một thời điểm cụ thể hoặc tổng thời gian hoạt động của ứng dụng? Hoặc có thể bạn có nghĩa là các lớp học có phương pháp được gọi nhiều nhất? (đo lường dựa trên thời gian hoặc đo đếm số lần gọi) –

+0

[J là gì? [Tôi là mảng số nguyên, nhưng J? –

Trả lời

0

Có lẽ không phải không có trải qua JVM Tool Interface (JVM TI) hay can thiệp vào việc thực hiện các đối tượng (mà là một doanh nghiệp khó khăn).

Bài viết này có thể hữu ích: Creating a Debugging and Profiling Agent with JVMTI.

+0

cảm ơn bạn đã góp ý. Tôi nghĩ rằng bằng cách sử dụng nguồn jmap có thể là lựa chọn tốt .. nó là nguy hiểm trên môi trường sống .. http://www.java2s.com/Open-Source/Java-Document/6.0-JDK-Modules-sun/tools/sun/tools /jmap/JMap.java.htm – Trustin

0

Nếu bạn có ý nghĩa là được sử dụng hàng đầu, các lớp được khởi tạo nhiều nhất, bạn có thể xác định một điểm quanh các nhà xây dựng và theo dõi các khởi tạo cho từng loại. Bạn có thể sử dụng AspectJ cho vấn đề đó.

+0

Tôi muốn làm điều tương tự với jmap -histo [: live] pid mà không thay đổi chương trình của chúng tôi. bởi vì hệ thống đang hoạt động. tôi không muốn thêm chi phí bằng cách thêm điểm cuts.also tôi không thể tin tưởng phương pháp finilizer để giảm số lượng. – Trustin

+0

vì vậy bạn muốn xem số lượng cá thể tại một điểm nhất định, tôi nghĩ bạn muốn xem tổng số phiên bản đã tạo. Sau đó, tôi nghĩ rằng những gì bạn cần là một API lược tả. Bạn có thể kiểm tra gói java.lang.management nhưng tôi không chắc liệu có thể nhận được số lượng cá thể không – hakan

0

Tôi không nghĩ rằng bạn có thể làm điều đó trong cùng một JVM bởi vì bạn cần phải đi qua heap đối tượng, và bạn có thể sẽ đi vào một vòng lặp vô hạn. Chỉ cần ra khỏi tò mò, tôi đã cố gắng sinh sản jmap sử dụng Runtime.exec chống lại cùng một JVM và thậm chí chống lại một JVM khác và nó chỉ bị treo?

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

Bạn có thể khởi jmap như một phần của wrapper kịch bản java của bạn và chạy nó liên tục trong một vòng lặp:

Ví dụ, nếu bạn đang ở trên Unix, bạn có thể làm một cái gì đó như:

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