2015-01-29 14 views
18

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à:

  1. 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ớ,
  2. 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ó
  3. 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ụ.

+1

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

+0

Đâ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? –

+0

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

Trả lời

3

WeakEventHandler được cung cấp để cho phép GC đối tượng nghe (nếu không được tham chiếu khác) và chỉ dừng hoạt động tại thời điểm đó. Như bạn đã phát hiện, điều này có nghĩa là bạn phải tham khảo trình xử lý miễn là bạn cần nó để tiếp tục kích hoạt. Yêu cầu này ít nhiều độc lập cho dù bạn sử dụng một lớp ẩn danh hay không; nó sẽ thất bại trong cùng một cách nếu bạn sử dụng một lớp bình thường.

Không có cách nào có thể để "tự động" xác định rằng một sự kiện nhất định sẽ không được kích hoạt trong tương lai nữa, về bản chất yêu cầu tính năng "khắc phục" sự cố này sẽ yêu cầu. Nếu bạn không muốn GC bất cứ điều gì bạn chỉ có thể thêm tất cả các trình lắng nghe ẩn danh vào danh sách được lưu trữ dưới dạng biến tĩnh ở đâu đó. Nếu bạn muốn GC làm việc (và cuối cùng bạn sẽ), bạn sẽ phải kiểm soát nó bằng cách duy trì tài liệu tham khảo chỉ khi họ là cần thiết và phát hành chúng khi không còn.

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