我使用org.jdom.input.SAXBuilder解析XML文件,Web应用系统中会频繁调用,但是可能因为解析后内存不能及时释放,导致tomcat经常出现OutOfMemory的现象,各位有没有好的办法解决这个问题呢?代码如下:
/* 利用SAX建立Document */
SAXBuilder bSAX = new SAXBuilder(false);
/* 生成document对象 */
docJDOM = bSAX.build(listXml);
//System.out.println(System.currentTimeMillis()-start);
/* Document的根 */
root = docJDOM.getRootElement();
/* 查询时间 */
recordElement = root.getChild("time");
......
如果能像C++那样自己主动释放内存就好了,郁闷啊!
/* 利用SAX建立Document */
SAXBuilder bSAX = new SAXBuilder(false);
/* 生成document对象 */
docJDOM = bSAX.build(listXml);
//System.out.println(System.currentTimeMillis()-start);
/* Document的根 */
root = docJDOM.getRootElement();
/* 查询时间 */
recordElement = root.getChild("time");
......
如果能像C++那样自己主动释放内存就好了,郁闷啊!
解决方案 »
- 如何用jdbc,jsp,mysql实现上传和下载啊?
- 求助,Tomcat问题~
- 提问:关于JBPM
- ServletContext接口的getAttributeNames和ServletConfig的getInitParameterNames有何区别
- 标签换行问题
- 使用jtds驱动连接sql数据库时为什么会产生jtds.tmp缓存文件,怎样消除缓存文件
- Datawindows 在 Jsp 的情况
- struts连接池用的不是dbcp么????
- 求javamail借收MultiPart邮件的代码
- 高手请出手:用resin从数据库blob字段中下载文件后,再打开出现乱码
- Jsp中的内容
- JSP连接sql2000所遇到的问题
强制调用内存垃圾回收
System.gc();
主要的代码如下:
class UserXMLParser implements XMLParser{
... ...
QueryBean parseListXml(InputStream in){
QueryBean query = new QueryBean();
QueryBean queryBean = new QueryBean();
Document docJDOM = null;
Element root = null;
Element recordElement = null;
Element leafElement = null;
List recordList = null;
List retList = null;
int listSize = 0;
try {
/* 利用SAX建立Document */
SAXBuilder bSAX = new SAXBuilder(false);
/* 生成document对象 */
docJDOM = bSAX.build(listXml);
/* Document的根 */
root = docJDOM.getRootElement();
/* 查询时间 */
recordElement = root.getChild("time");
queryBean.setTime(Long.parseLong(recordElement.getText())); ... ... }catch (Exception e) {
e.printStackTrace();
return null;
}
return queryBean;
}
}
调用的方法:
XMLParser xmlParser = null; InputStream in = new FileInputStream("product.xml");
xmlParser = new ProductGroupParser();
queryBean = xmlParser.parseListXml(in);
返回值queryBean,主要用来在页面上显示queryBean中的相关数据,我使用JProfiler测了一下,频繁调用这段代码就会造成内存不断增加,我怀疑是页面引用queryBean造成解析的XML不能及时释放,不知道有没有办法解决这个问题。
因为 saxparser解析XML要用的是saxparser.parser(InputStream in, DefaultHandler handler);所以,楼主可以在DefaultHandler handler里做手脚,写一个简单的伪代码:class TestSAX extends DefaultHandler{ @overwrite
public void startElement(String namespaceURI,String localName,String qName,Attributes atts)
{
//这里就是每次读进一个像<object>标识就调用这个方法,这个是parser实现的,你只要跟据你的数据来处理
}
@overwrite
public void endElement(String namespaceURI,String localName,String fullName )throws SAXException{
// if(做些判断,判断你的要传输的数据到这里就是一条完整的记录,可以写入数据库)
{
//在这里调用xmldecoder.readobject() 读出来的数据,写进数据库,然后xmldecoder.cloes()就可以啦。
}
} @overwrite
public void characters( char[] chars, int start, int length )throws SAXException{
//将元素内容累加到StringBuffer中
buf.append(chars,start,length);
}
}
值得注意是System.gc()不是万能的,不能回收的资源有:
网络连接,数据库连接,文件流等。