このバグを突き止めるために、コードを次の部分に取り除きました。
非常に単純な 1 つの JSF2 ページ:
<!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:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
<h:head>
<f:facet name="first">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Simple OOM Check</title>
</f:facet>
</h:head>
<h:body>
<h:outputText value="#{oomCheckBean.testString}"/>
</h:body>
</html>
そして、使用された @ViewScoped Bean oomCheckBean:
@ViewScoped
@ManagedBean(name = "oomCheckBean")
public class OomCheckBean implements Serializable {
private static final long serialVersionUID = 6325712415478215045L;
private String testString;
@PostConstruct
public void init() {
testString = "Hello World";
System.out.println("I will survive ....");
}
@PreDestroy
public void destroy() {
System.out.println("... klaaatsch!");
}
/**
* @return the testString
*/
public String getTestString() {
return testString;
}
/**
* @param testString the testString to set
*/
public void setTestString(String testString) {
this.testString = testString;
}
}
この後、JMeter テストケースをログインに変更し、この oomCheck.xhtml ページを呼び出してログアウトしました。しばらくしてテストの実行を停止し、JMX を使用して最初に手動でガベージ コレクターを呼び出しました ( java.lang.Memory --> Operations --> gc() )。この後、メソッドを呼び出してヒープ ダンプを作成します ( com.sun.management.HotSpotDiagnostic --> Operations --> dumpHeap() )。
結果は私の質問で述べたようなものです.メモリにはたくさんの OomCheckBean オブジェクトがあります。所有者オブジェクトはorg/jboss/as/web/deployment/ConcurrentReferenceHashMap$HashEntry
. この問題を解決するための助けをいただければ幸いです。上記のように、JSF バージョンが 2.1.16 にアップグレードされた場合、これらの @ViewScoped Bean は破棄され、doctype の欠落や AJAX の問題などの他の「バグ」が残ります。したがって、セッションが無効になったときに @ViewScoped Bean を破棄する方法を誰かが知っていれば幸いです。