हमारे JavaEE6 परियोजना (EJB3, JSF2) में JBoss 7.1.1 पर, ऐसा लगता है हम SeamFaces @ViewScoped
साथ एक स्मृति रिसाव है।ViewScoped बीन के साथ मेमोरी रिसाव?
हम इस तथ्य की जांच करने के लिए एक छोटे प्रोटोटाइप बनाया:
- हम JMeter का प्रयोग कर एक पेज 200 गुना कॉल करने के लिए;
- पृष्ठ में एक दृश्यमान बीन है जो एक राज्यव्यापी ईजेबी इंजेक्ट करता है;
- हम सत्र टाइमआउट को 1 मिनट पर ठीक करते हैं।
परीक्षण, हम VisualVM के साथ स्मृति की सामग्री की जांच, और यहाँ के अंत हम क्या मिला पर:
-
एक
- , हम अभी भी स्टेटफुल
MyController
की 200 उदाहरणों मिल - और@PreDestroy
विधि कभी नहीं कहा जाता है; @ConversationScoped
बीन,@preDestroy
विधि को सत्र अंत कहा जाता है और फिर हमें एक साफ़ स्मृति मिलती है।
@ViewScoped
सेम के साथ
क्या हम दृश्यमान क्षेत्र का बुरी तरह से उपयोग करते हैं, या यह वास्तव में एक बग है?
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:s="http://jboss.org/seam/faces">
<f:metadata>
<f:viewParam name="u" value="#{myBean.uselessParam}" />
<s:viewAction action="#{myBean.callService}" />
</f:metadata>
<h:body >
<f:view>
</f:view>
</h:body>
</html>
अब शामिल सेम myBean
:
यहाँ एक्सएचटीएमएल पृष्ठ है। @ConversationScoped
संस्करण के लिए, सभी टिप्पणी किए गए भाग असम्बद्ध हैं।
@ViewScoped
// @ConversationScoped
@Named
public class MyBean implements Serializable
{
@Inject
MyController myController;
//@Inject
//Conversation conversation;
private String uselessParam;
public void callService()
{
//if(conversation.isTransient())
//{
// conversation.begin();
//}
myController.call();
}
public String getUselessParam()
{
return uselessParam;
}
public void setUselessParam(String uselessParam)
{
this.uselessParam = uselessParam;
}
}
और फिर इंजेक्शन स्टेटफुल सेम MyController
:
@Stateful
@LocalBean
public class MyController
{
public void call()
{
System.out.println("call ");
}
@PreDestroy
public void destroy()
{
System.out.println("Destroy");
}
}
हमने सीओडीआई के साथ प्रयास किया और परीक्षण अच्छी तरह से चला गया। अच्छा! –