FOP Servlet 内存泄漏
FOP Servlet memory leak
我创建了一个 web servlet,如下例所示:
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();
}
}
但是,当我停止 tomcat 时,我遇到了内存泄漏。我可以在日志中找到的内容:
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.
我尝试过的:
在 ServletContext
的 contextDestroyed
方法中强制 System.gc();
。
有什么办法可以解决这个问题吗?在我停止 tomcat.
后发生内存泄漏
使用 maven 的 jiderhamn 罐子解决了。
我创建了一个 web servlet,如下例所示:
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();
}
}
但是,当我停止 tomcat 时,我遇到了内存泄漏。我可以在日志中找到的内容:
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.
我尝试过的:
在 ServletContext
的 contextDestroyed
方法中强制 System.gc();
。
有什么办法可以解决这个问题吗?在我停止 tomcat.
后发生内存泄漏使用 maven 的 jiderhamn 罐子解决了。