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/.
Xerces库中的内存泄漏
最近同时接到客户的反应,说他们的Java应用有内存泄漏问题:在长时间的运行当中,系统越来越慢,最后抛出“OutofMemory”的错误。一个是基于XML数据交换的应用,另外一个是Sun的JES Portal Server。经过调查,这些内存泄漏都是出自一个来源: Apache的Xerces库(http://xerces.apache.org/)。

内存泄漏的根源在于“XMLReaderManager”这个类.这是个类工厂,通过“getXMLReader() ”方法,可以创建“XMLReader”的对象实例。但是,为了性能上的考虑,这个类会将“XMLReaders”对象进行缓存, 缓存的颗粒度是基于线程的(每个线程有自己的缓存)。当线程使用了“XMLReader”对象之后,需要调用“releaseXMLReader()”。正是这个方法有问题才导致了内存泄漏。XMLReaderManager在调用 “releaseXMLReader()”方法之后,并不释放XMLReader对象,而是将它标记为“free”。
当执行XML解析的线程死掉或者异常中止之后,XMLReaderManager中还包含一个“HashTable”,指向这些无法释放的XMLReader对象,而这些对象又引用着刚才解析的XML文档和其他数据结构,这就造成了泄漏。
临时的解决方案是用别的XML解析包来替换Xerces库。例如使用最新版的 xalan.jar和serializer.jar放在 JVM所使用的类路径下,并使用下面的方式替换XML解析包:
java -cp .:xalan.jar:serializer.jar -Djavax.xml.transform.TransformerFactory=org.apache.xalan.xsltc.trax.TransformerFactoryImpl YourAppName。
另外在JDK1.5.0_12中的JAXP中已经解决了这个问题。但是这个版本需要下个月才能发布。JDK6中已经解决了这个问题。
Posted at 05:04下午 四月 17, 2007 by 王昱 in Java | 评论[0]