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?
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ó. –
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! –
Sự cố với G1 là không thể sử dụng JConsole để thực sự xem điều gì đang xảy ra –