2010-03-23 28 views
11

Máy ảo Java hỗ trợ một số chiến lược thu gom rác.Làm thế nào tôi có thể xem java thu gom rác nào đang sử dụng

Điều này article giải thích chúng.

Bây giờ tôi tự hỏi chiến lược nào (được chọn tự động) mà ứng dụng của tôi đang sử dụng, có cách nào để cho JVM (phiên bản 1.6) in thông tin này không?

Chỉnh sửa: JVM phát hiện xem nó có đang ở chế độ máy khách hoặc máy chủ không. Vì vậy, câu hỏi thực sự là làm thế nào tôi có thể nhìn thấy cái đã được phát hiện?

+2

Lưu ý rằng các cuộc đàm phán bài viết về ** một thực hiện cụ thể ** (đặc biệt là HotSpot JVM từ Sun JRE). –

+0

Có bạn là chính xác. – Thirler

+0

Xin lưu ý rằng bạn không nhất thiết chỉ sử dụng một GC. Bạn thường có các chiến lược khác nhau cho các khu vực khác nhau. Nếu bạn sử dụng CMS, tôi nghĩ rằng mặc định là sử dụng một "song song mới" cho khu vực trẻ. – Fredrik

Trả lời

13

http://java.sun.com/j2se/1.5.0/docs/guide/vm/gc-ergonomics.html đó là áp dụng cho J2SE 6 cũng khẳng định rằng mặc định là Collector Parallel.

Chúng tôi đã thử nghiệm này một lần trên một JVM 1.5 bằng cách thiết lập chỉ

-server -Xms3g -Xmx3g -XX:PermSize=128m -XX:LargePageSizeInBytes=4m -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps 

và đầu ra cho thấy

 
41359.597: [GC [PSYoungGen: 90499K->32K(377344K)] 268466K->181862K(2474496K), 0.0183138 secs] 
41359.615: [Full GC [PSYoungGen: 32K->0K(377344K)] [PSOldGen: 181830K->129760K(2097152K)] 181862K->129760K(2474496K) [PSPermGen: 115335K->115335K(131072K)], 4.4590942 secs] 

nơi PS là viết tắt của Nhặt phế liệu Parallel

0

Điều gì về thông tin được cung cấp bởi tùy chọn dòng lệnh -verbose: gc và -XX: + PrintGCDetails? Nó có hữu ích không?

[Chỉnh sửa: Rõ ràng không]

+0

Điều đó không in được bộ thu gom rác nào đang được sử dụng. – Thirler

4

Như Joachim đã chỉ ra, bài viết bạn đề cập đến mô tả các chiến lược VM được cung cấp bởi VM của Sun. Bản thân đặc tả VM không yêu cầu các thuật toán GC cụ thể và do đó sẽ không có ý nghĩa gì nếu có liệt kê các giá trị cho các API này trong API.

Bạn tuy nhiên có thể nhận được một số infos từ API quản lý:

List<GarbageCollectorMXBean> beans = 
    ManagementFactory.getGarbageCollectorMXBeans(); 

lặp lại qua các hạt cà phê, bạn có thể lấy tên của GC (mặc dù chỉ là một chuỗi) và tên của các hồ nhớ, được quản lý bởi các GC khác nhau.

13

jmap -heap

In tóm tắt đống. Thuật toán GC được sử dụng, cấu hình heap và cách sử dụng đống thông minh được tạo ra.

http://java.sun.com/javase/6/docs/technotes/tools/share/jmap.html

+0

Đây chính xác là những gì tôi cần, tiếc là nó không có sẵn trên Windows (không có đầu mối tại sao mặc dù). – Thirler

+0

Có thể bạn nên thêm thông tin đó (Windows) vào câu hỏi;) – fglez

7

Đặt này trong JAVA_OPTS:

-XX:+UseSerialGC -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps 

Đối với UseSerialGC chúng ta sẽ thấy trong nhật ký:

7.732: [GC 7.732: [DefNew: 419456K->47174K(471872K), 0.1321800 secs] 419456K->47174K(1520448K), 0.1322500 secs] [Times: user=0.10 sys=0.03, real=0.14 secs] 

Đối với UseConcMarkSweepGC chúng ta sẽ thấy trong nhật ký:

5.630: [GC 5.630: ['ParNew: 37915K->3941K(38336K), 0.secs] 78169K->45163K(1568640K), 0.0124030 secs] [Times: user=0.02 sys=0.00, real=0.01 secs] 

Đối với UseParallelGC chúng ta sẽ thấy trong nhật ký:

30.250: [GC [PSYoungGen: 441062K->65524K(458752K)] 441062K->76129K(1507328K), 0.1870880 secs] [Times: user=0.33 sys=0.03, real=0.19 secs] 
1

Bạn có thể viết progam đơn giản mà kết nối qua jmx để quá trình java của bạn:

public class PrintJMX { 
    public static void main(String[] args) throws Exception { 
    String rmiHostname = "localhost"; 
    String defaultUrl = "service:jmx:rmi:///jndi/rmi://" + rmiHostname + ":1099/jmxrmi"; 
    JMXServiceURL jmxServiceURL = new JMXServiceURL(defaultUrl); 

    JMXConnector jmxConnector = JMXConnectorFactory.connect(jmxServiceURL); 
    MBeanServerConnection mbsc = jmxConnector.getMBeanServerConnection(); 


    ObjectName gcName = new ObjectName(ManagementFactory.GARBAGE_COLLECTOR_MXBEAN_DOMAIN_TYPE + ",*"); 

    for (ObjectName name : mbsc.queryNames(gcName, null)) { 
     GarbageCollectorMXBean gc = ManagementFactory.newPlatformMXBeanProxy(mbsc, 
     name.getCanonicalName(), 
     GarbageCollectorMXBean.class); 

     System.out.println(gc.getName()); 
    } 

    } 
} 
4

Hình như, chúng tôi có cách thuận tiện hơn để xác định phiên bản GC khi chạy. Luôn sử dụng các công cụ, đề xuất của tôi. Để xác định phiên bản GC chúng ta cần hai công cụ đi kèm với JVM (đặt trong thư mục jdk/bin của bạn):

  1. VisualVM - bắt đầu nó và cố gắng để cấu hình một số quá trình (ví dụ bạn có thể cấu hình VisualVM chính nó). Tiểu sử của bạn sẽ hiển thị cho bạn PID quy trình (xem hình chữ nhật màu xanh lục ở ảnh chụp màn hình).
  2. jMap - bắt đầu công cụ này với -heap <PID> lựa chọn và tìm ra một chuỗi dành riêng cho một loại rác Collector (thấy một đường màu hồng tại một ảnh chụp màn hình)

enter image description here

1

Cách tốt nhất để có được điều này là: Go để dòng lệnh và nhập lệnh sau đây.

java -XX: + PrintCommandLineFlags -version

Nó sẽ cho bạn thấy kết quả như sau:

C:\windows\system32>java -XX:+PrintCommandLineFlags -version 
-XX:InitialHeapSize=132968640 -XX:MaxHeapSize=2127498240 -XX:+PrintCommandLineFl 
ags -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:-UseLargePagesInd 
**ividualAllocation -XX:+UseParallelGC** 
java version "1.8.0_66" 
Java(TM) SE Runtime Environment (build 1.8.0_66-b17) 
Java HotSpot(TM) 64-Bit Server VM (build 25.66-b17, mixed mode)`enter code here` 
Các vấn đề liên quan