Bằng cách "phát hành", tôi có nghĩa là không có tham chiếu đến trình nạp lớp còn lại.Khi nào là finalize được gọi là trên singletons khi một classloader được phát hành?
Chúng tôi đang gặp sự cố trong đó ứng dụng Java EE thường được triển khai lại sẽ chiếm không gian permgen. Phân tích cho thấy rằng một singleton trong ứng dụng Java EE đã chuyển các tham chiếu đến các đối tượng lớp ứng dụng bên ngoài ứng dụng (vi phạm các quy tắc Java EE) và không xóa chúng khi ứng dụng không được triển khai.
Giả sử không có tài liệu tham khảo nào khác còn lại đối với singleton hoặc đối tượng lớp, sẽ finalize() của singleton được gọi khi trình nạp lớp của lớp đó được phát hành? Tôi muốn xóa các tham chiếu trong giới hạn giả mạo ở đó. Hoặc tôi đang ở trong một catch-22 nơi finalize sẽ không được gọi cho đến khi các classloader chính nó có thể được thu gom rác thải - và do đó sẽ không bao giờ được gọi là vì các tài liệu tham khảo bên ngoài rogue?
Câu hỏi chính ở đây có lẽ là:
một đối tượng lớp sẽ được thu gom rác trong trường hợp này, nơi classloader của nó không thể chưa? Điều này có thể phụ thuộc vào đặc điểm kỹ thuật của hành vi của trình nạp lớp hoặc có thể phụ thuộc vào việc triển khai thực hiện.
Tài liệu tham khảo (loại khác! ;-)) sẽ được đánh giá cao nhưng không cần thiết.
Nếu bạn chuyển tài liệu tham khảo của ClassLoaders xem xét sử dụng WeakReference (s) và WeakHashMap thay vì tham chiếu mạnh (thông thường). – Stefan