Một trong những rò rỉ bộ nhớ mà tôi đã phát hiện trong ứng dụng của chúng tôi là trường tĩnh riêng java.awt.Window.allWindows
, theo dõi mọi Cửa sổ được khởi tạo. Chúng tôi có các hộp thoại được tạo ra, sử dụng, và sau đó bị lãng quên, và kỳ vọng là chúng sẽ biến mất và được thu gom rác. Trường riêng tư này giữ chúng trong phạm vi, vô thời hạn, cho đến khi phương thức dispose()
được gọi trên chúng. Và theo định nghĩa, chúng tôi không thể làm điều đó khi họ đã đi ra khỏi phạm vi.Tại sao bạn phải vứt bỏ() một java.awt.Window không nằm trong phạm vi?
Tôi không hiểu tại sao điều này được thiết kế theo cách này. Có vẻ như trái ngược với tinh thần thu gom rác thải phải cho hệ thống biết rõ khi nào tôi làm xong với một đối tượng Window. Rõ ràng là tôi đã làm xong với nó, vì nó nằm ngoài phạm vi.
Tôi hiểu phương thức dispose()
đang làm: loại bỏ các đối tượng ngang hàng hệ thống. Tôi hiểu rằng đây là bên ngoài của Java và bạn cần một số cách để làm điều đó và Swing đó không nên chỉ mất theo dõi của những đối tượng, nếu không nó sẽ có một rò rỉ bộ nhớ. Nhưng những gì được thực hiện bằng cách giữ một tham chiếu đến cửa sổ của tôi xung quanh mãi mãi, khi tôi sẽ không bao giờ sử dụng nó một lần nữa?
Ai đó có thể giải thích lý do tại sao điều này là cần thiết?
Khi 'removeNotify' được gọi,' Window' sẽ bị xóa khỏi 'allWindows'. 'Window' chứa các tài nguyên gốc, và vì vậy nên được xử lý theo cùng một cách như thể nó là một kết nối cơ sở dữ liệu. –
Tôi đã cảm thấy rằng khi các kết nối cơ sở dữ liệu của tôi đi ra khỏi phạm vi, chúng tự động đóng lại.Tôi có lẽ sai về điều đó. :) Ngày nay, tất cả những gì được quản lý cho tôi bởi một máy chủ ngoại trừ các chương trình ngắn. – skiphoppy