2010-02-01 23 views
7

Tôi vừa thử tùy chọn -XX:+DoEscapeAnalysis được bật trên jdk6-u18 VM (trên solaris) và có trải nghiệm khá đáng thất vọng. Tôi đang chạy một ứng dụng scala có khá nhiều diễn viên (20.000 người trong số họ). Đây là một công thức để tạo rác!Trải nghiệm phân tích thoát được bật trên JVM

Thông thường ứng dụng có thể chạy với 256Mb heap nhưng tạo ra lượng lớn rác thải. Trong trạng thái ổn định của nó nó:

  • dành 10% thời gian trong GC
  • tạo> 150MB rác trong < tuổi 30 mà sau đó được GC'd

Tôi nghĩ rằng phân tích sức mạnh thoát giúp tôi vì vậy tôi đã bật tùy chọn và chạy lại ứng dụng. Tôi thấy rằng các ứng dụng ngày càng không thể xóa sạch rác mà nó đã thu thập cho đến khi nó dường như cuối cùng để dành toàn bộ thời gian làm GC và ứng dụng "phẳng" khi phân bổ đầy đủ.

Tại thời điểm này, tôi nên nói rằng ứng dụng không ném OutOfMemoryError mà tôi đã mong đợi. Có lẽ JConsole (mà tôi đã sử dụng để thực hiện phân tích) không hiển thị đúng số liệu thống kê GC với tùy chọn này trên (Tôi không thuyết phục)?

Sau đó tôi đã xóa tùy chọn và khởi động lại và ứng dụng đã trở thành "bình thường" một lần nữa! Bất cứ ai có bất cứ ý tưởng gì có thể xảy ra?

Trả lời

8

Phân tích thoát có hiển thị khi được bật trong JConsole không? Bạn cần đảm bảo rằng bạn đang chạy VM với tùy chọn -server. Tôi cho rằng bạn đã làm việc này, nhưng tôi chỉ nghĩ rằng tôi sẽ kiểm tra.

Tôi không nghĩ rằng phân tích thoát sẽ giúp tình hình với diễn viên Scala. Bạn có thể thấy mức tăng lớn, nếu bạn làm điều gì đó như:

def act():Unit = { 
    val omgHugeObject = new OMGHugeObject(); 
    omgHugeObject.doSomethingCrazy(); 
} 

Trong ví dụ trên các EscapeAnalysis sẽ làm cho nó để omgHugeObject có thể được cấp phát trên stack thay vì đống và do đó không tạo ra rác. Tôi không nghĩ rằng có khả năng phân tích thoát sẽ giúp với các diễn viên. Tài liệu tham khảo của họ sẽ luôn luôn "thoát" vào hệ thống con diễn viên.

Bạn có phiên bản mới nhất của Scala không? Có một rò rỉ bộ nhớ mà tôi tin là đã được sửa trong một phiên bản gần đây. Điều này thậm chí còn gây ra Lift để sinh ra thư viện Actor riêng mà bạn có thể xem xét.

Bạn có thể thử các nhà sưu tập G1Garbage Bạn có thể kích hoạt nó với:

-XX:+UnlockExperimentalVMOptions -XX:+UseG1GC

+0

Nếu đối tượng của nó đang được chuyển từ chuỗi này sang chủ đề khác, không chỉ phân bổ ngăn xếp sẽ là không thể, tôi đoán cũng sẽ có vấn đề với Bộ đệm phân bổ địa phương chủ đề (TLAB). Tôi tin rằng JVM JRockit thậm chí còn tích cực hơn với hành vi bộ nhớ luồng-cục bộ của nó. –

+0

Tôi không mong đợi phân tích thoát để có thể trợ giúp các diễn viên * mỗi lần *, nhưng có rất nhiều chuyển đổi tiềm ẩn khác đang diễn ra trong ứng dụng trên ngăn xếp có thể được ưu tiên. Tôi đã chỉ hy vọng sẽ làm cho một số loại vết lõm trong chi phí GC! –

+0

Sự cố với G1 là không thể sử dụng JConsole để thực sự xem điều gì đang xảy ra –

3

Tôi đề nghị bạn cố gắng để tăng kích thước thế hệ mới, ví dụ -XX:NewSize=96M XX:NewRatio=3. Sử dụng JVisualVM (được bao gồm trong JDK), với Plugin Visual GC để xem cách sử dụng không gian trẻ và cũ.

+0

Có - Tôi đã thử điều này và nó hầu như không có bất kỳ sự khác biệt nào. Tôi đã thử tỷ lệ khác nhau, từ 1 đến 4 –

6

từ jdk-u18 release notes:

Lưu ý rằng thoát tối ưu hóa phân tích dựa trên (-XX: + DoEscapeAnalysis) bị vô hiệu hóa trong 6u18. Tùy chọn này sẽ được khôi phục trong bản cập nhật Java SE 6 trong tương lai.

+1

Có, nó được kích hoạt theo mặc định trong Java 6u23 và sau đó (Xem http://docs.oracle.com/javase/7/docs/technotes/guides/vm/performance-enhancements-7. html). –

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