TL; DR: GC đang ăn các ràng buộc hoạt động của tôi.Cách tiếp cận được khuyến nghị để giữ các ràng buộc trung gian là rác được thu thập trong JavaFX 8
Tôi có một ứng dụng đã được phát triển và thành công được triển khai sử dụng JavaFX 2.2 trên Java 7.
Khi tôi nâng cấp/chuyển sang JavaFX 8.0 (và Java 8), tính năng nhất định sẽ "bí ẩn" ngừng làm việc - giữa vòng đời của ứng dụng - không có ngoại lệ hoặc các dấu hiệu khác của sự thay đổi trạng thái sai. Ví dụ; nút ngừng hoạt động, trình kết xuất ô tùy chỉnh đã ngừng được áp dụng, trạng thái đã bật/tắt đã ngừng nhận được cập nhật.
Sau nhiều giờ đào, tôi nghĩ rằng tôi đã theo dõi vấn đề xuống những gì tôi hiểu là một số thay đổi trong JavaFX 8 và sử dụng nội bộ của javafx.beans.WeakListener
để xử lý rò rỉ bộ nhớ trong JavaFX 2.2. Về cơ bản, có vẻ như các ràng buộc mà tôi đang tạo ra để quản lý phụ thuộc trạng thái dữ liệu đang nhận được thu thập rác mặc dù thực tế là kiểm soát của họ Node
vẫn hoạt động.
Các sự cố thường gặp nhất khi tôi khởi tạo các liên kết bằng cách sử dụng các lớp ẩn danh. Một số nhưng không phải tất cả các vấn đề của tôi có thể được cố định bằng cách lưu trữ một tham chiếu đến ràng buộc như một thành viên lớp, do đó giữ cho GC thu thập nó. Tôi thậm chí đã có toàn bộ bộ điều khiển có được GC'd bởi vì họ đã được instantiated thông qua tải FXML và không bao giờ trực tiếp tham chiếu (tôi bây giờ luôn là một tham chiếu đến bộ điều khiển trong thuộc tính của nút cha userData
).
vấn đề của tôi là:
- lỗi liên quan đến phát sinh không tất định (hoặc ít nhất một chức năng của bộ nhớ,
- nếu bindings mặc dù lớp nặc danh nên tránh, đó là rất nhiều công việc để tìm mỗi trường hợp trong một cơ sở mã hiện lớn để thay đổi nó
- thậm chí nếu tôi có thể tìm thấy mọi trường hợp, nó clutters lên mã vô cùng
phiền, tôi dường như không thể để tìm bất kỳ thứ gì trong tài liệu Oracle có nội dung "không tạo các ràng buộc với các lớp ẩn danh", hoặc bất kỳ hướng dẫn nào khác để đảm bảo sử dụng đáng tin cậy các ràng buộc. Rất nhiều ví dụ về mã ở đó sử dụng các liên kết lớp ẩn danh ẩn danh. Tôi cũng không thể tìm thấy bất kỳ ghi chú nào về cách cập nhật đúng cách ứng dụng JavaFX 2.2 cho JavaFX 8.
Bất kỳ lời khuyên nào từ những người đang phát triển không quan trọng Các ứng dụng JavaFX được đánh giá cao (Tôi đã phát triển các ứng dụng JavaFX 2.x cho 3 năm và ứng dụng Swing trong> 15 năm, vì vậy đây không phải là câu hỏi chính xác của n00b).
Lưu ý: Câu hỏi của tôi cũng tương tự như Clean JavaFX property listeners and bindings (memory leaks), nhưng tôi muốn biết cụ thể và dứt khoát làm thế nào để sử dụng các ràng buộc phức tạp và đảm bảo họ sẽ không được thu gom rác thải tại thời điểm ngẫu nhiên, mà không cần đến gây ô nhiễm các lớp học với tham chiếu đến mọi ví dụ.
bạn có thể xây dựng một chút về "thay đổi trong JavaFX 8 và sử dụng nội bộ của javafx.beans.WeakListener" vì tôi không biết về những điều đó (thừa nhận, từ chối nhìn quá sâu vào fx trước 8 ;-) - trong kinh nghiệm ràng buộc thu gom rác luôn luôn (và vẫn là) một phiền toái ... – kleopatra
Đây là hành vi rất lạ. Bạn có thể cho thấy một ví dụ về việc thực hiện của người nghe của bạn? –
Có một thời gian khó tìm kiếm lại thay đổi thiết lập tài liệu từ Oracle về vấn đề này (rất nhiều liên kết chết). Dưới đây là hai chủ đề về vấn đề trước JavaFX 8: https://javafx-jira.kenai.com/browse/RT-32087, https://community.oracle.com/thread/2396063. – metasim