2012-02-15 34 views
6

Tôi đang sử dụng Java 5 và ứng dụng máy chủ tùy chỉnh của chúng tôi cần điều chỉnh GC, như một số lần chúng tôi đang tạm dừng 15-20 giây vào giờ cao điểm. Chúng tôi đang chạy Java 5 trên một máy chủ lớp máy chủ với JVM args như -server -d64Có cách nào để biết thuật toán GC nào JVM hiện đang sử dụng

Có cách nào để cho biết thuật toán GC mà JVM hiện đang sử dụng không?

http://docs.oracle.com/javase/1.5.0/docs/guide/vm/gc-ergonomics.html

Trên máy server-class chạy máy chủ ảo, thu gom rác (GC) đã thay đổi từ nhà sưu tập hàng loạt trước đây (-XX:+UseSerialGC) cho một nhà sưu tập song song (-XX:+UseParallelGC). Bạn có thể ghi đè lên mặc định này bằng cách sử dụng tùy chọn dòng lệnh -XX:+UseSerialGC cho lệnh java.

1) Tôi muốn biết điều đó có thực sự xảy ra không?

câu hỏi tiếp theo của tôi là Tôi đã thêm các đối số dòng sau vào lệnh

-verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCApplicationConcurrentTime -Xloggc:logs/gc.log

2) họ sẽ có bất cứ hoạt động hoặc ảnh hưởng hành vi trên JVM chạy trừ đăng nhập bản ghi GC?

Trả lời

0

Nếu GC đang trở thành vấn đề, tôi khuyên bạn nên xem xét Java RTS (real-time system).

Java RTS cho phép bạn kiểm soát chính xác thời điểm GC hoạt động. Có nghĩa là bạn có quyền kiểm soát hoàn toàn trường hợp xấu nhất và do đó, có thể mô phỏng cách hệ thống của bạn sẽ hoạt động trong điều kiện căng thẳng nhất có thể.

1

Bạn có thể sử dụng (các) gc hiện tại đang sử dụng bằng cách sử dụng GarbageCollectorMXBeans.

Và khá nhiều tất cả ghi nhật ký có ảnh hưởng đến hiệu suất.

5

bạn có thể sử dụng - XX: + PrintFlagsFinal để in ra các tham số JVM và cài đặt của chúng.

java -XX: + PrintFlagsFinal -server -version

1

Bạn có thể sử dụng để in jmap -heap <jvm_pid> java tóm tắt đống. Ví dụ, bản tóm tắt đống Intellij là như sau nếu tôi chạy jmap -heap 2592:

Gắn để xử lý ID 2592, vui lòng đợi ...
Debugger gắn thành công.
Trình biên dịch máy chủ được phát hiện.
Phiên bản JVM là 25.101-b13

sử dụng các chủ đề song song trong thế hệ mới.
sử dụng phân bổ đối tượng địa phương .
đồng thời Mark-Sweep GC
rút gọn ...

Như bạn bạn có thể nhận ra từ đầu ra, các trường hợp JVM chạy với 2592 quá trình id đang sử dụng CMS thuật toán GC.

Ngoài ra, nếu thuật toán được xác định bởi những cờ -XX:+Use*GC, bạn có thể thấy rằng sử dụng jcmd <pid> VM.flags. Ví dụ:

$ jcmd 2715 VM.flags 
2715: 
-XX:CICompilerCount=4 -XX:InitialHeapSize=268435456 
-XX:MaxHeapSize=734003200 -XX:MaxNewSize=244318208 
-XX:MinHeapDeltaBytes=524288 -XX:NewSize=89128960 -XX:OldSize=179306496 
-XX:+UseCompressedClassPointers -XX:+UseCompressedOops 
-XX:+UseFastUnorderedTimeStamps -XX:+UseParallelGC 

Như bạn có thể thấy rằng VM đang sử dụng Parallel GC.

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