英文:
FOP Servlet memory leak
问题
我已创建一个Web Servlet,示例如下:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
FopFactory fopFactory = FopFactory.newInstance(new File(".").toURI());
// 设置缓冲区以获取内容长度
ByteArrayOutputStream out = new ByteArrayOutputStream();
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, out);
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer(new StreamSource(PATH_TO_XSL));
// 确保XSL转换的结果通过FOP进行传输
Result res = new SAXResult(fop.getDefaultHandler());
// 设置输入源
Source src = new StreamSource(new File("./resources/Employees.xml"));
// 启动转换和呈现过程
transformer.transform(src, res);
// 准备响应
response.setContentType("application/pdf");
response.setContentLength(out.size());
// 将内容发送到浏览器
response.getOutputStream().write(out.toByteArray());
response.getOutputStream().flush();
} catch (Exception e) {
e.printStackTrace();
}
}
然而,当我停止Tomcat时,我遇到了内存泄漏问题。我在日志中找到的信息如下:
SEVERE [http-nio-8080-exec-4] org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks Web应用程序[fop]创建了一个类型为[java.lang.ThreadLocal](值为[java.lang.ThreadLocal@294d3ff4])的ThreadLocal,值为[org.apache.xerces.parsers.SAXParser](值为[org.apache.xerces.parsers.SAXParser@af83efc]),但在停止Web应用程序时未能删除它。线程将在一段时间后重新创建,以尝试避免可能的内存泄漏。
我尝试过的方法:
在ServletContext
的contextDestroyed
方法中强制使用 System.gc();
。
有没有办法解决这个问题?内存泄漏发生在我停止Tomcat之后。
英文:
I have created a web servlet as the following example:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try{
FopFactory fopFactory = FopFactory.newInstance(new File(".").toURI());
//Setup a buffer to obtain the content length
ByteArrayOutputStream out = new ByteArrayOutputStream();
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, out);
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer(new StreamSource(PATH_TO_XSL));
//Make sure the XSL transformation's result is piped through to FOP
Result res = new SAXResult(fop.getDefaultHandler());
//Setup input
Source src = new StreamSource(new File("./resources/Employees.xml"));
//Start the transformation and rendering process
transformer.transform(src, res);
//Prepare response
response.setContentType("application/pdf");
response.setContentLength(out.size());
//Send content to Browser
response.getOutputStream().write(out.toByteArray());
response.getOutputStream().flush();
}catch(Exception e){
e.printStackTrace();
}
}
Howerver, when I stop the tomcat I get a memory leak. What I could find in the logs:
SEVERE [http-nio-8080-exec-4] org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks The web application [fop] created a ThreadLocal with key of type [java.lang.ThreadLocal] (value [java.lan
g.ThreadLocal@294d3ff4]) and a value of type [org.apache.xerces.parsers.SAXParser] (value [org.apache.xerces.parsers.SAXParser@af83efc]) but failed to remove it when the web application was stopped. Threads are going to be renewed over t
ime to try and avoid a probable memory leak.
What I have tried:
Force System.gc();
in contextDestroyed
method of ServletContext
.
Any ideas how I can fix this problem? The memory leak is occurring after I stop tomcat.
答案1
得分: 0
使用Maven中的jiderhamn jars解决。
英文:
solved using jiderhamn jars from maven.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论