Tôi có JFrame chấp nhận các tệp cấp cao nhất. Tuy nhiên sau khi một giọt đã xảy ra, tham chiếu đến khung được tổ chức vô hạn định bên trong một số lớp nội bộ Swing. Tôi tin rằng việc vứt bỏ khung hình sẽ giải phóng tất cả các tài nguyên của nó, vậy tôi đang làm gì sai?Rò rỉ bộ nhớ với Swing Kéo và thả
Ví dụ
import java.awt.datatransfer.DataFlavor;
import java.io.File;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.TransferHandler;
public class DnDLeakTester extends JFrame {
public static void main(String[] args) {
new DnDLeakTester();
//Prevent main from returning or the jvm will exit
while (true) {
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
}
}
}
public DnDLeakTester() {
super("I'm leaky");
add(new JLabel("Drop stuff here"));
setTransferHandler(new TransferHandler() {
@Override
public boolean canImport(final TransferSupport support) {
return (support.isDrop() && support
.isDataFlavorSupported(DataFlavor.javaFileListFlavor));
}
@Override
public boolean importData(final TransferSupport support) {
if (!canImport(support)) {
return false;
}
try {
final List<File> files = (List<File>)
support.getTransferable().getTransferData(DataFlavor.javaFileListFlavor);
for (final File f : files) {
System.out.println(f.getName());
}
} catch (Exception e) {
e.printStackTrace();
}
return true;
}
});
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
pack();
setVisible(true);
}
}
Để tái sản xuất, chạy các mã và thả một số tập tin trên khung. Đóng khung để nó được xử lý.
Để xác minh rò rỉ, tôi lấy một bãi chứa đống bằng cách sử dụng JConsole và phân tích nó với Eclipse Memory Analysis tool. Nó cho thấy rằng sun.awt.AppContext đang giữ một tham chiếu đến khung thông qua hashmap của nó. Có vẻ như TransferSupport bị lỗi.
image of path to GC root http://img402.imageshack.us/img402/4444/dndleak.png
Tôi đang làm gì sai? Tôi có nên yêu cầu mã hỗ trợ DND để tự dọn dẹp không?
Tôi đang chạy bản cập nhật JDK 1.6 19.
Tôi bắt đầu nghĩ đây là lỗi JVM. Các lớp DnD có liên quan không có mã để xóa các tham chiếu vi phạm, vì vậy trừ khi DropHandler được loại bỏ khỏi bản đồ của AppContext bằng cách nào đó (tôi không thực sự hiểu được lớp đó), sự rò rỉ sẽ vẫn còn. – tom
Bài đăng trên diễn đàn này mô tả một vấn đề tương tự [http://forums.java.net/jive/thread.jspa?messageID=276311]. Nó không có phản hồi. – tom