2013-03-14 33 views
-2

我們在Tomcat中運行XML解析器,我相信這會導致類net.sf.saxon.om.NamePool $ NameEntry的對象的逐步建立。我附加了jmap -histo輸出的前幾行。我想找到一種釋放這些對象佔用的堆的方法。我們也使用Nux來執行XQueries。類名池使用很多Java堆

num  #instances   #bytes class name 

1:  5685069  893436760 [C 
2:   34441  141621392 [Lnet.sf.saxon.om.NamePool$NameEntry; 
3:  1170902  110741752 [B 
4:  3302685  105685920 java.util.HashMap$Entry 
5:  3692440  88618560 net.sf.saxon.om.NamePool$NameEntry 
6:  3763876  88396424 [Ljava.lang.String; 
7:  982469  78743016 [Ljava.lang.Object; 
8:  3119061  74857464 org.apache.xerces.util.SymbolTable$Entry 
9:  2328168  74501376 org.apache.xerces.xni.QName 
10:  602517  69475280 [Ljava.util.HashMap$Entry; 

回答

0

大多數XSLT和XQuery工作負載涉及有限的詞彙量(即一組元素和屬性名)和namepool將擴大,直到它擁有這個詞彙,然後將保持穩定。

如果您的詞彙量是無限的,例如元素和屬性的名稱是隨機產生的(或者系統地),NamePool大小可能會成爲問題。如果您的工作負載情況如此,那麼您可能需要找到一種方法將其分區到不同的名稱池中,並在不再需要時釋放名稱池。無法從現有的名稱池中刪除名稱條目。

早期版本的Saxon使元素和屬性(例如變量名稱和函數名稱)以外的名稱更爲多用。檢查您是否使用最新版本。

最後,請注意,歡迎您在dev.saxonica.com上使用Saxon論壇來解決撒克遜特定問題,這使您更有機會從Saxonica獲得及時答覆。