मेरे पास ऐसी स्थिति है जो महीनों के लिए मुझे यातना दे रही है: मैं ओओएम अपवाद (हीप स्पेस) प्राप्त कर रहा हूं और ढेर डंप का निरीक्षण करने पर मुझे ऑब्जेक्ट्स के लाखों उदाहरण मिल गए हैं जिन्हें मैंने कभी आवंटित नहीं किया था, लेकिन संभवतः अंतर्निहित पुस्तकालयों में आवंटित किया गया था। ज्यादा खून, पसीने और आँसू बाद मैं स्मृति रिसाव पैदा कोड स्थानीय बनाना करने में कामयाब रहे है और मैं इसे स्पष्ट करने के लिए एक, कम से कम पूरा और निरीक्षण कोड नमूना बना दिया है:जावा एक्सपैथ मेमोरी रिसाव?
:import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.concurrent.Worker;
import javafx.scene.web.WebEngine;
import javafx.stage.Stage;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class MVC extends Application implements ChangeListener<Worker.State>{
private final WebEngine engine = new WebEngine();
private final String url = "https://biblio.ugent.be/publication?sort=publicationstatus.desc&sort=year.desc&limit=250&start=197000";
private final XPath x = XPathFactory.newInstance().newXPath();
@Override
public void start(Stage primaryStage) throws Exception {
System.setProperty("jsse.enableSNIExtension", "false");
engine.getLoadWorker().stateProperty().addListener(this);
engine.load(url);
}
public static void main(String[] args) {
launch(args);
}
private NodeList eval(Node context, String xpath) throws XPathExpressionException{
return (NodeList)x.evaluate(xpath, context, XPathConstants.NODESET);
}
@Override
public void changed(ObservableValue<? extends Worker.State> observable, Worker.State oldValue, Worker.State newValue) {
if (newValue==Worker.State.SUCCEEDED) {
try {
while(true){
NodeList eval = eval(engine.getDocument(), "//span[@class='title']");
int s = eval.getLength();
}
} catch (XPathExpressionException ex) {
Logger.getLogger(MVC.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}
कोड निम्नलिखित करता है
JavaFX
WebEngine
का उपयोग कर एक दस्तावेज़ लोड करें।- बेहद परिणाम या यह की ओर इशारा संग्रह किए बिना
javax.xml
संकुल, का उपयोग कर दस्तावेज़ पर एक xpath क्वेरी प्रदर्शन करते हैं।
चलाने के लिए, जावाएफएक्स एप्लिकेशन बनाएं, डिफ़ॉल्ट पैकेज में MVC.java नाम की एक फ़ाइल जोड़ें, कोड दर्ज करें और हिट रन करें। कोई भी प्रोफाइलिंग टूल (मैं VisualVM का उपयोग करता हूं) आपको तुरंत दिखाता है कि कुछ मिनटों में, ढेर अनियंत्रित रूप से बढ़ता है। निम्नलिखित वस्तुओं आवंटित किया जाना है, लेकिन कभी जारी नहीं लग रहे हैं:
java.util.HashMap$Node
com.sun.webkit.Disposer$WeakDisposerRecord
com.sun.webkit.dom.NamedNodeMapImpl$SelfDisposer
java.util.concurrent.LinkedBlockingQueue$Node
यह व्यवहार यूआरएल की, हर बार जब मैं कोड को चलाने के लिए होता परवाह किए बिना मैं लोड या xpath मैं दस्तावेज़ पर निष्पादित करता हूं।
सेटअप जिसके साथ मैं परीक्षण किया:
- MBP चल OS X Yosemite (अप-टू-डेट)
- JDK 1.8.0_60
किसी को भी इस समस्या को पुनः कर सकते हैं? क्या यह एक वास्तविक स्मृति रिसाव है? क्या मै कुछ कर सकता हुं?
संपादित
मेरा एक सहयोगी JDK 1.8.0_45 के साथ एक W7 मशीन पर समस्या reproduced, और यह रूप में अच्छी तरह एक Ubuntu सर्वर पर होता है।
संपादित 2
मैं javax.xml पैकेज के लिए एक विकल्प के रूप में jaxen परीक्षण किया है, लेकिन परिणाम एक ही है, जो मुझे विश्वास करने के लिए बग सूरज वेबकिट भीतर गहरे झूठ हैं
संभवतः संबंधित: http://stackoverflow.com/questions/6340802/java-xpath-apache-jaxp-implementation-performance – Warkst
मैं इस पर पुन: पेश कर सकते हैं विंडोज 7 64-बिट, जावा 1.8.0_60। यह एक स्मृति रिसाव प्रतीत होता है। मैंने JavaFX को शामिल किए बिना एक मनमानी एक्सएमएल फ़ाइल पर एक ही लूप करने की कोशिश की, और एक ही परिणाम मिला। – VGR
इस पर ध्यान देने के लिए धन्यवाद! मैंने javafx का उपयोग नहीं करने पर भी विचार नहीं किया था, लेकिन आप पूरी तरह से सही हैं, बग गहरी है, और जिस तरह से डब्ल्यू 3 सी दस्तावेज प्रदान किया गया है वह महत्वपूर्ण नहीं है। – Warkst