के साथ मेमोरी लीक मेरे पास एक जेफ्रेम है जो फ़ाइलों की शीर्ष-स्तरीय बूंदों को स्वीकार करता है। हालांकि एक बूंद के बाद, फ्रेम के संदर्भ कुछ स्विंग आंतरिक कक्षाओं के भीतर अनिश्चित काल तक आयोजित किए जाते हैं। मेरा मानना है कि फ्रेम का निपटान अपने सभी संसाधनों को छोड़ देना चाहिए, तो मैं गलत क्या कर रहा हूं?स्विंग ड्रैग और ड्रॉप
उदाहरण
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);
}
}
, पुन: पेश कोड चलाने के लिए और फ्रेम पर कुछ फ़ाइलों को छोड़ दें। फ्रेम बंद करें ताकि इसका निपटारा हो।
रिसाव को सत्यापित करने के लिए मैं जेकोनसोल का उपयोग करके एक ढेर डंप लेता हूं और इसे Eclipse Memory Analysis tool के साथ विश्लेषण करता हूं। यह दिखाता है कि sun.awt.AppContext फ्रेम के संदर्भ में हैशपैप के माध्यम से है। ऐसा लगता है कि ट्रांसफरसपोर्ट गलती पर है।
image of path to GC root http://img402.imageshack.us/img402/4444/dndleak.png
क्या मैं गलत कर रहा हूँ? क्या मुझे किसी भी तरह से खुद को साफ करने के लिए डीएनडी समर्थन कोड पूछना चाहिए?
मैं JDK 1.6 अद्यतन 19.
मुझे लगता है कि यह एक जेवीएम बग है। प्रासंगिक डीएनडी कक्षाओं में अपमानजनक संदर्भों को साफ़ करने के लिए कोड नहीं है, इसलिए जब तक DropHandler को AppContext के मानचित्र से हटाया नहीं जाता है (मैं वास्तव में उस वर्ग को समझ नहीं पाता), रिसाव बनी रहेगी। – tom
यह फ़ोरम पोस्ट एक समान समस्या का वर्णन करता है [http://forums.java.net/jive/thread.jspa?messageID=276311]। इसे कोई जवाब नहीं मिला। – tom