« 十一月 2008
星期日星期一星期二星期三星期四星期五星期六
      
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
      
今天

Blog::Navigation

Blog::Editing

Bookmarks::Blogroll

Blog::Referers

Site notes

This page validates as XHTML 1.0, and will look much better in a browser that supports web standards, but it is accessible to any browser or Internet device. It was created using techniques detailed at glish.com/css/.

Powered by Roller Weblogger.
« Xerces库中的内存泄漏 | Main | 有关Sun Portal Server的... »
星期二 四月 17, 2007

Sun JES Portal Server中的内存泄漏问题

有使用Sun Portal Server 2005Q1或Q4的客户反映,如果长时间的运行Portal服务器,最后Portal会出现内存泄漏的问题,经过测试,发现泄漏的主要元凶是在XML解析包Xerces库中。

用户在长时间使用Portal服务器的时候,会发现系统越来越慢,最后造成内存溢出或者系统长时间停顿进行内存回收。刚开始,我们还怀疑是客户自己的应用造成了内存的泄漏。但是最后经过测试,才将目标定位到Portal本身。下面是客户进行jmap命令导出的内存映象:

num   #instances    #bytes  class name
--------------------------------------
  1:    991081   870917080  [I
  2:   5145481   641366104  [C
  3:   2053574   254331176  [Ljava.lang.Object;
  4:   3108680    74608320  java.lang.String
  5:    427945    61625312  [[I
  6:   2562450    61498800  com.sun.org.apache.xerces.internal.xni.QName
  7:   2288309    54919416  java.util.HashMap$Entry
  8:   1233788    49351520  com.sun.org.apache.xerces.internal.util.XMLAttributesImpl$Attribute
  9:     46811    48683440  [Lcom.sun.org.apache.xml.internal.dtm.DTM;
 10:    493921    43535872  [Ljava.util.HashMap$Entry;
 11:   1801622    43238928  com.sun.org.apache.xml.internal.dtm.ref.ExpandedNameTable$HashEntry
 12:     46811    38572264  [Lcom.sun.org.apache.xml.internal.dtm.ref.ExpandedNameTable$HashEntry;
 13:   1281240    30749760  com.sun.org.apache.xerces.internal.util.AugmentationsImpl$SmallContainer
 14:   1193093    28634232  com.sun.org.apache.xml.internal.dtm.ref.ExtendedType
 15:   1138883    27333192  com.sun.org.apache.xerces.internal.util.SymbolTable$Entry
 16:     46812    24716280  [Lcom.sun.org.apache.xml.internal.dtm.ref.ExtendedType;
 17:    401476    23631816  [Ljava.util.Hashtable$Entry;
 18:   1281240    20499840  com.sun.org.apache.xerces.internal.util.AugmentationsImpl
 19:    427050    20498400  com.sun.org.apache.xml.internal.utils.SuballocatedIntVector
 20:     47452    19740032  [Lcom.sun.org.apache.xerces.internal.util.SymbolTable$Entry;

根据上面的信息,我们可以大致定位到内存泄漏的问题跟Xerces的泄漏问题有关(详细信息请参见我另外有关Xerces泄漏问题的博客文章)。

解决方案有以下几种:

  1. 使用另外的XML解析包。这在“Xerces库中的内存泄漏”的文章中介绍过。
  2. 配置Portal Server使用Thread Pool来获取channel的内容,这样就会使用ThreadLocal变量,触发了Xerces中的ThreadLocal的代码,从而幸运的避免了这个严重的Bug。具体做法是在desktopconfig.properties 的配置文件中,将callerPool的三个参数分别设置为64,128和8。
  3. 使用JDK1.5.0_12或JDK6.0以上的JDK版本,因为在这些新的JDK版本中已经将Xerces的Bug解决了。(XML解析包已经是JDK核心类库的一部分了).
  4. 使用Portal 7以上版本,在这些版本中的XML解析使用了不同的方法,绕过了内存泄漏的问题.

 

评论:

发表一条评论:
该日志评论功能被禁用了。
Copyright (C) 2003, 王昱