Tôi có một ứng dụng JavaFX giảm thiểu đến khay khi nhấn nút X. Tôi đã theo dõi ứng dụng thông qua VisualVM cho các xu hướng bộ nhớ.JavaFX 8 Rò rỉ bộ nhớ khi ẩn Giai đoạn
Phần lạ là khi ứng dụng đang mở hoặc thu nhỏ thành thanh tác vụ, bộ nhớ luôn được GC trở lại bộ nhớ ban đầu được sử dụng. Tuy nhiên, khi nó được thu nhỏ xuống khay (stage.hide()
, systemTray.show()
), bộ nhớ được GCed, nhưng trong một xu hướng tăng (rò rỉ).
Trong VisualVM, không gian thế hệ cũ tiếp tục tăng lên, và khi nó chạm tối đa sau một thời gian, ứng dụng sẽ không phản hồi và CPU tăng lên 80%.
Tôi nhận thấy rằng nếu tôi stage.show()
trên ứng dụng bằng cách nhấp đúp vào biểu tượng khay, v.v. GC sẽ xóa mọi thứ trở lại bình thường. Tuy nhiên, nếu để lại trong thời gian dài, nó sẽ chỉ đơn giản là không GC các gen cũ.
Kết xuất vùng heap hiển thị javafx.scene.Scene#7
và javafx.scene.Node[]#2
là có không gian được giữ lại nhiều nhất. Cả hai sẽ không xuất hiện nếu sân khấu không bị ẩn. Trong tham chiếu, nó hiển thị this[] -> dirtyNodes()
.
this - value: javafx.scene.Node[] #2
<- dirtyNodes - class: javafx.scene.Scene, value: javafx.scene.Node[] #2
<- value - class: javafx.scene.Node$ReadOnlyObjectWrapperManualFire, value:
javafx.scene.Scene #7
Điều gì gây ra điều này và làm cách nào tôi có thể giải quyết vấn đề này?
Tôi đã giảm đáng kể lượng bộ nhớ bị rò rỉ khi giai đoạn bị ẩn bằng cách xóa hình ảnh GIF duy nhất và một trên sân khấu. Tuy nhiên, vấn đề vẫn xảy ra. Tôi nghi ngờ rằng chủ đề nền cập nhật giao diện người dùng khi nó bị ẩn đang khiến cảnh/nút giữ tham chiếu đến giá trị cũ. Thực hành tốt nhất để cập nhật các ứng dụng như thế nào? Ứng dụng của tôi giống như một ứng dụng trò chuyện với ~ 50 người dùng trực tuyến bất kỳ lúc nào. – staticvoid
có thể là lỗi fx - bạn có thể xem xét báo cáo trong trình theo dõi vấn đề fx, tốt nhất với ví dụ ngắn gọn để thể hiện hành vi – kleopatra
Tôi đồng ý với @kleopatra, có vẻ như lỗi sản phẩm và chỉ nhà phát triển mới có thể giúp bạn ở đó. Theo dõi lỗi JavaFX có tại đây: https://javafx-jira.kenai.com/ –