2009-12-10 25 views
17

Tôi vẫn đang điều tra các vấn đề tôi có với điều chỉnh GC (xem prior question), bao gồm rất nhiều đọc và thử nghiệm.Thông số GC nào là JVM đang chạy?

Sun Java5 + JVM cố gắng tự động chọn chiến lược và tham số GC tối ưu dựa trên môi trường của chúng, điều này rất tuyệt, nhưng tôi không thể tìm ra cách truy vấn JVM đang chạy để tìm hiểu các tham số đó là gì.

Lý tưởng nhất, tôi muốn xem giá trị của các tùy chọn liên quan đến GC khác nhau đang được sử dụng, như được VM tự động chọn. Nếu tôi có điều đó, tôi có thể có một đường cơ sở để bắt đầu tinh chỉnh.

Bất kỳ ai biết khôi phục các giá trị này từ máy ảo đang chạy?

Trả lời

18

Kiểm tra các HotSpotDiagnosticMBean

Ví dụ sau sẽ in ra giá trị của một lựa chọn cũng như cho dù giá trị là DEFAULT hoặc VM_CREATION:

import java.lang.management.ManagementFactory; 

import javax.management.ObjectName; 
import javax.management.openmbean.CompositeData; 
import javax.management.openmbean.CompositeDataSupport; 

public class HotSpotTest { 

    public static void main(String [] args) throws Exception { 
     printHotSpotOption("MaxHeapFreeRatio"); 
     printHotSpotOption("SurvivorRatio"); 
     printHotSpotOptions(); 
    } 

    private static void printHotSpotOption(String option) throws Exception { 
     ObjectName name = new ObjectName("com.sun.management:type=HotSpotDiagnostic"); 
     String operationName = "getVMOption"; 
     Object [] params = new Object [] {option}; 
     String [] signature = new String[] {String.class.getName()}; 
     Object result = ManagementFactory.getPlatformMBeanServer().invoke(name, operationName, params, signature); 
     CompositeDataSupport data = (CompositeDataSupport) result; 

     System.out.println(option); 
     System.out.println("- Value: "+data.get("value")); 
     System.out.println("- Origin: "+data.get("origin")); 
    } 

    private static void printHotSpotOptions() throws Exception { 
     ObjectName name = new ObjectName("com.sun.management:type=HotSpotDiagnostic"); 
     String attributeName = "DiagnosticOptions"; 
     Object result = ManagementFactory.getPlatformMBeanServer().getAttribute(name, attributeName); 
     CompositeData [] array = (CompositeData[]) result; 
     for (CompositeData d : array) { 
      System.out.println(d.get("name")); 
      System.out.println("- Value: "+d.get("value")); 
      System.out.println("- Origin: "+d.get("origin")); 
     } 
    } 
} 
+0

+1 Thú vị, tôi chưa từng thấy điều đó trước đây. Tôi sẽ có một vở kịch, xem nó có đủ chi tiết không. – skaffman

+0

Điều này thực sự gần gũi với những gì tôi cần, ngoại trừ việc tôi cần phải biết VMOptions nào yêu cầu. Đó là một sự xấu hổ thực sự nó không thể cho tôi biết những gì có sẵn. – skaffman

+0

Tôi đã sửa đổi ví dụ để in các tùy chọn chẩn đoán khả dụng. Tuy nhiên, nó không in mọi tùy chọn VM có sẵn. Tất cả các tùy chọn VM được liệt kê ở đây, bạn có thể bị mắc kẹt xây dựng danh sách các tùy chọn bạn muốn và truy vấn chúng: http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp – Kevin

0

Bạn có thể sử dụng JMX cho điều đó. Khởi đầu JConsole, và nó sẽ được hiển thị dưới tab VM Tóm tắt. Nó sẽ hiển thị tất cả các đối số đã được truyền cho JVM.

Để làm điều đó programatically, bạn có thể tham khảo một câu trả lời SO: How to get vm arguments from inside of java application?

+0

Cảm ơn, nhưng tôi biết tôi đã chuyển đối số nào cho VM, vì tôi có tập lệnh chạy nó. Tôi muốn biết những giá trị VM đã mặc định cho những tham số mà tôi đã không chỉ định. – skaffman

0

Nếu bạn đang tìm kiếm một công cụ dễ đọc và dễ đọc, jconsole có thể là bạn của bạn ở đây. Cụ thể, tôi đang nhìn vào "VM Tóm tắt" tab trên trình FindBugs hiện đang chạy của tôi và tôi thấy những chi tiết này:

hiện tại đống kích thước: 788.720 Kbytes

kích thước heap tối đa: 932.096 Kbytes

nhớ cam kết: 923.648 Kbytes

thời gian chờ quyết toán: 0 đối tượng

thu rác: Tên = 'PS MarkSweep', bộ sưu tập = 324, Tổng thời gian = 12 phút

thu rác: Tên = 'PS nhặt rác', bộ sưu tập = 1.132, Tổng thời gian = 1 phút

Rõ ràng, jvisualvm sẽ cung cấp cho bạn thông tin chi tiết liên quan nhưng nó dường như không được khá như tập trung chặt chẽ vào nhu cầu cụ thể của bạn (tức là, các chi tiết có thể đọc được nhanh chóng trên bộ thu gom rác).

7

Lý tưởng nhất, tôi muốn xem giá trị của các tùy chọn liên quan đến GC khác nhau đang được sử dụng như được VM tự động chọn. Nếu tôi có điều đó, tôi có thể có một đường cơ sở để bắt đầu tinh chỉnh.

Thường không dễ dàng để suy ra cấu hình chính xác heap chỉ từ cờ dòng lệnh được cung cấp.

Nếu bạn cần biết cấu hình heap và bạn đang ở trong môi trường không phải Windows, bạn có thể sử dụng jmap -heap như được giải thích trong số blog entry này.

Đây là một ví dụ về các thông tin được cung cấp:

 
    using parallel threads in the new generation. 
    using thread-local object allocation. 
    Concurrent Mark-Sweep GC 

    Heap Configuration: 
     MinHeapFreeRatio = 40 
     MaxHeapFreeRatio = 70 
     MaxHeapSize  = 1073741824 (1024.0MB) 
     NewSize   = 268435456 (256.0MB) 
     MaxNewSize  = 268435456 (256.0MB) 
     OldSize   = 805306368 (768.0MB) 
     NewRatio   = 7 
     SurvivorRatio = 6 
     PermSize   = 21757952 (20.75MB) 
     MaxPermSize  = 88080384 (84.0MB) 
27

-XX: + PrintCommandLineFlags In cờ trôi qua trên dòng lệnh hoặc cấu hình bởi các thái (auto-sizing) tính năng.

-XX: + PrintFlagsInitial Dumps TẤT CẢ các cờ và giá trị mặc định.

-XX: + PrintFlagsFinal Dumps TẤT CẢ các cờ sau khi xử lý dòng lệnh và thái.

Vì vậy, tôi nghĩ rằng sau này sẽ làm cho bạn, chỉ cần thêm nó vào kịch bản dòng lệnh của bạn.

Các vấn đề liên quan