Tengo un JFrame que acepta caídas de archivos de nivel superior. Sin embargo, después de que se produjo una caída, las referencias al marco se mantienen indefinidamente dentro de algunas clases internas de Swing. Creo que la eliminación del marco debería liberar todos sus recursos, entonces, ¿qué estoy haciendo mal?Pérdida de memoria con arrastrar y soltar
Ejemplo
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);
}
}
reproducir, ejecutar el código y soltar algunos archivos en el marco. Cierra el marco para que se deseche.
Para verificar la fuga, tomo un volcado de pila usando JConsole y lo analizo con el Eclipse Memory Analysis tool. Muestra que sun.awt.AppContext mantiene una referencia al cuadro a través de su hashmap. Parece que TransferSupport tiene la culpa.
image of path to GC root http://img402.imageshack.us/img402/4444/dndleak.png
¿Qué estoy haciendo mal? ¿Debería pedirle al código de soporte de DnD que se limpie de alguna manera?
estoy ejecutando JDK 1.6 update 19.
Estoy empezando a pensar que esto es un error de JVM. Las clases DnD relevantes no tienen código para borrar las referencias ofensivas, así que a menos que DropHandler se elimine del mapa de AppContext de alguna manera (realmente no entiendo esa clase), la fuga permanecerá. – tom
Esta publicación del foro describe un problema similar [http://forums.java.net/jive/thread.jspa?messageID=276311]. No obtuvo respuestas. – tom