2012-10-26 17 views
7

जेबीओएस 7.1.1 पर हमारे जावाई 6 प्रोजेक्ट (ईजेबी 3, जेएसएफ 2) में, ऐसा लगता है कि हमारे पास @ViewScoped सेम के साथ मेमोरी रिसाव है। पिछले पेड़ के दिनों में मैंने इस मुद्दे की जांच पर समय बिताया है। इसलिए मैंने दो पेजों के साथ सरल प्रोजेक्ट बनाया है ताकि यह सुनिश्चित किया जा सके कि @ViewScoped बीन छोड़ने वाले पहले पृष्ठ को रिलीज़ किया जाएगा।लिंक्ड व्यूस्कोप्ड बीन्स मेमोरी लीक

<context-param> //web.xml 
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name> 
    <param-value>server</param-value> 
</context-param> 
<context-param> 
    <param-name>javax.faces.PARTIAL_STATE_SAVING</param-name> 
    <param-value>false</param-value> 
</context-param> 

TreeBean.java

@ManagedBean 
@ViewScoped 
public class TreeBean implements Serializable { 
private TreeNode root; 
public static AtomicInteger count = new AtomicInteger(0); 

@Override 
protected void finalize() throws Throwable { 
    System.out.println("TreeBean beans count: " + count.decrementAndGet() + " (FINALISATION)"); 
} 


public TreeBean() { 
    super(); 
    System.out.println("TreeBean beans count: " + count.incrementAndGet() + " (INITIALISATION)"); 
} 

first.xhtml

.... 
    <h:form id="frm"> 
     <p:tree 
      value="#{treeBean.root}" 
      var="node" 
      id="tree"> 
    .... 
    <p:commandLink 
      action="second.xhtml?faces-redirect=true" 
      value="toSecond" /> 
    ....    

second.xhtml

.... 
    <h:form id="frm"> 
    .... 
    <p:commandLink 
      action="first.xhtml?faces-redirect=true" 
      value="toFirst" /> 
    .... 

sysout:

INFO [stdout] (http--0.0.0.0-8080-4) TreeBean beans count: 1 (INITIALISATION) 
    INFO [stdout] (http--0.0.0.0-8080-4) TreeBean beans count: 2 (INITIALISATION) 
    INFO [stdout] (http--0.0.0.0-8080-4) TreeBean beans count: 3 (INITIALISATION) 
    ...... 
    INFO [stdout] (Finalizer) TreeBean beans count: 2 (FINALISATION) 
    INFO [stdout] (Finalizer) TreeBean beans count: 1 (FINALISATION) 
    INFO [stdout] (Finalizer) TreeBean beans count: 0 (FINALISATION) 

और सभी सोचता है कि अच्छी तरह से आया था जब तक मैं अन्य @ViewScoped सेम

TreeBean.java

@ManagedBean 
@ViewScoped 
public class TreeBean implements Serializable { 
private TreeNode root; 

@ManagedProperty(value = "#{treeNodeBean}") 
private TreeNodeBean treeNodeBean; 


public static AtomicInteger count = new AtomicInteger(0); 

@Override 
protected void finalize() throws Throwable { 
    System.out.println("TreeBean beans count: " + count.decrementAndGet() + " (FINALISATION)"); 
} 


public TreeBean() { 
    super(); 
    System.out.println("TreeBean beans count: " + count.incrementAndGet() + " (INITIALISATION)"); 
} 

TreeNodeBean.java

@ManagedBean 
@ViewScoped 
public class TreeNodeBean implements Serializable { 

    private String treeNodeItem="TreeNodeItem"; 

} 

लिए और है कि कोई भी के बाद निर्भरता जोड़ दिया है बीन जारी किया गया है। क्या कोई जानता है कि इससे कैसे निपटें? क्या यह एक बग है या इसे कहीं कॉन्फ़िगर किया जा सकता है?

+0

इस लिंक का संदर्भ लें। जेएसएफ 2.1 और 2.2 http://stackoverflow.com/questions/12182844/memory-leak-with-viewscoped-bean –

उत्तर

5

दुर्भाग्य से, आप सही कर रहे हैं, वहाँ @ViewScoped स्मृति प्रबंधन के साथ मुद्दों में जाना जाता है (और सिर्फ विचारों चेनिंग के साथ संबंध नहीं है) के रूप में आप here और here देखेंगे। this question पर भी देखें, आप वर्तमान सत्र के अनुसार UIViewRoot ऑब्जेक्ट पर अपने हाथों को प्राप्त करने के लिए प्रयोग कर सकते हैं और कुछ ईवेंट के आधार पर getViewMap().remove("myView") पर कॉल करें। आप this

इससे संबंधित नहीं हो सकते हैं, आप दृश्य स्कैन बीन्स क्यों देख रहे हैं? वे विचारों के लिए, नाम के रूप में इस्तेमाल करने का इरादा रखते हैं। क्या आप SessionScoped का उपयोग करने से बाध्य हैं?

+0

के लिए किया गया कार्य हालांकि मैं vievscoped उपयोगकर्ता गतिविधि की छोटी अवधि के लिए डिज़ाइन किया गया है। इसलिए बीन लाइव है जब तक आप वर्तमान पृष्ठ छोड़ नहीं देते। वेब सत्र ड्रॉप तक सत्र सत्र लंबे समय तक रहते हैं। तो मेरी पसंद स्मृति को बचाने के लिए था। – bohdanius

+1

@ बोहदानीस, मैंने मान लिया है कि आपके पास पहले से ही आपके वेब ऐप में एक सत्र स्कैन किया गया बीन था और यदि आप ऐसा करते हैं, जो भी आप दृश्य स्कोप में संग्रहीत कर रहे हैं जिसे आपको 3 अलग-अलग विचारों में संदर्भित करने की आवश्यकता है, वहां रखा जाना चाहिए। इसके बाद आप इसे साफ करने का आरोप लगा सकते हैं (वर्र्स को शून्य या जो भी सेट कर सकते हैं) या सत्र के साथ इसे नष्ट कर सकते हैं। यदि आपके पास सत्र बीन स्थापित नहीं है, तो यह एक के लिए एक मजबूत मामला है। एक और विकल्प फ्लैश स्कोप है, जो मुख्य रूप से लागू होता है यदि तीन विचार अनुक्रमिक हैं – kolossus

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

  • कोई संबंधित समस्या नहीं^_^