2012-04-11 20 views
5

मैंने एक नमूना एप्लिकेशन बनाया जो मेमोरी लीक को उत्तेजित करता है।एकाधिक दृश्य बनाने पर जावाएफएक्स 2.0 मेमोरी लीक

समस्या यह है कि मुझे दृश्यों को "पुनः लोड" करने की आवश्यकता है। यदि मेरे पास एक बटन (बटन बटन और बटनफू) के साथ दो दृश्य (बार और फू) हैं, तो बटन वर्तमान दृश्य को एक नया बनाते हैं। यदि मैं 5 मिनट (या उससे कम) के लिए बटनबार और बटनफ़ू पर क्लिक करना चाहता हूं, तो उस सरल प्रोग्राम की स्मृति खपत उच्च और उच्च हो जाती है।

Bar.java

public class Bar implements Initializable { 

@FXML 
private Label label; 

@FXML 
private void toFoo(ActionEvent event) { 
    try { 
     Button button = (Button) event.getSource(); 
     Parent root = FXMLLoader.load(getClass().getResource("Foo.fxml")); 
     Stage currentStage = (Stage) button.getScene().getWindow(); 
     currentStage.setScene(new Scene(root)); 
    } catch (IOException ex) { 
     Logger.getLogger(Bar.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

@Override 
public void initialize(URL url, ResourceBundle rb) { 
    // TODO 
}  
} 

Foo.java ही बदलते डी fxml लोड हो रहा है है।

fxml केवल एक बटन शामिल हैं:

<Button id="buttonBar" layoutX="126" layoutY="90" text="Bar!" onAction="#toFoo" fx:id="buttonBar" /> 

वहाँ कोई वास्तविक स्मृति रिसाव समस्या है? क्या कोई ऐसा करने का दूसरा तरीका जानता है? मैं चाहता हूं कि यह ऐप जीवित रहे और एक सेवा की तरह हमेशा के लिए परिवर्तन कर रहे हों। धन्यवाद

उत्तर

1

मुझे एक ही समस्या है।

जब मैं माउस को दृश्य पर ले जाता हूं। स्मृति उपयोग बढ़ता है और कभी नीचे नहीं।

मुझे विश्वास है कि यह माउस घटनाओं से जुड़ा हुआ है।

शुभकामनाएं!

+1

हां। दृश्य बिल्डर के साथ कोई भी बातचीत गतिशील रूप से बढ़ती है ... यह जावा की साइट से डाउनलोड किया गया नवीनतम संस्करण है। यहां डब्ल्यूटीएफ अब भी जारी है? यह आपकी पोस्ट के 2 साल बाद है ... – crush

1

मुझे स्मृति रिसाव के बारे में निश्चित नहीं है, लेकिन प्रदर्शन कारणों से मैं संसाधन की बार-बार लोडिंग से बचूंगा।

मैं जो रूट करता हूं वह उस चर को एक चर में रखता है और इसे किसी दृश्य में जोड़ता है, या मेरे मामले में आवश्यकतानुसार किसी अन्य दृश्य के विशिष्ट हिस्से में, नियंत्रक वर्ग की स्थिर विधि के माध्यम से मानों को अद्यतन करता है।

मेरे पास इनमें से कई प्रीलोड किए गए दृश्य हैं, जो प्रत्येक बार जब उपयोगकर्ता किसी सूची से कुछ मूल्यों का चयन करता है तो एक बड़े दृश्य का एक हिस्सा अपडेट करता है।

1

मेरा सुझाव है कि आप FX8 आज़माएं। मेमोरी लीक के लिए पहले से ही फिक्सेस की मात्रा पहले से ही बनाई गई है।

यदि आप JavaFX के नवीनतम संस्करण में अपडेट नहीं कर सकते हैं, तो मेरा सुझाव है कि आप FXML में onAction="#toFoo" का उपयोग न करें।

इसके बजाय, एक ईवेंट हैंडलर घोषित करें और निम्न को कॉल करें: buttonBar.addEventHandler(MouseEvent.MOUSE_CLICKED, declaredEventHandler);

रिलीज फिर अपने वर्तमान स्क्रीन बाहर निकलने से पहले ईवेंट हैंडलर: buttonBar.removeEventHandler(declaredEventHandler);

संबंधित मुद्दे