2017-04-07 21:47

@JFinal 谢谢波总,这个问题就是接口给c++端上传图片的时候产生的。现在这个问题已经解决了。

2017-03-16 16:15

@JFinal看来我需要重新找个思路去解决这个问题。非常感谢您的帮忙。另外我是您的粉丝,相信jfinal 也会越来越好!

2017-03-13 17:50

@JFinal 感谢您及时的回复。这这样几个问题需要说明下:
1.导致内存溢出的线程并不是我们自己创建的,它是druid线程池内的线程。我尝试在项目完成启动之后,将对应的线程修改为deamon 线程,但是会报错。我的理解是正在运行的线程无法将其改为deamon 线程。
2.项目二导致溢出的线程和项目一的并不完全相同,可是使用的线程池,工程架构,以及jar包等都几乎是相同的。
3.这个内存溢出的问题,并不是绝对会出现的,有时候完全不做任何修改,仅仅重新打包就可以完好的运行。

另:附上个人实现的Tomcat关闭监听事件。
web.xml里面:

com.police.pro.job.JobListener


监听实现的方法:
package com.police.pro.job;

import java.util.Set;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class JobListener implements ServletContextListener {

@Override
public void contextInitialized(ServletContextEvent sce) {
// TODO Auto-generated method stub

}

@Override
public void contextDestroyed(ServletContextEvent sce) {

try {
//将指定的线程关闭
Set threads=Thread.getAllStackTraces().keySet();
// File file=new File("E:/the.txt");
// if(!file.exists()){
// file.createNewFile();
// }
// BufferedWriter bw=new BufferedWriter(new FileWriter(file,true));
for (Thread thread : threads) {
//获取线程的名称
String threadName=thread.getName();
if(threadName!=null && threadName.contains("DefaultQuartzScheduler")){
thread.stop();

System.out.println("被主动关闭的线程名称:"+threadName);
//将该线程的名字写到一个文件中
//bw.write(threadName);
}
}
//bw.close();
Thread.sleep(1000*3);
} catch (Exception e) {
e.printStackTrace();
}
}
}

以上就是个人疑问。

2017-03-13 17:09

@JFinal 非常抱歉,再次打扰您。我上次以为这个问题已经完美解决了,当时修改完之后,连续实际部署测试几次,也确实没有再发生内存溢出的问题。但是没想到今天再次打包进行部署的时候这个问题又一次发生了,这让我有了新的疑问。
1.Tomcat 在启动一个工程的时候,是不是没启动一个线程就会预先判断,该线程有没有结束的方法?没有就会报内存会溢出的警告.
2.上次的实现思路,是实现一个Tomcat关闭的监听事件,在Tomcat关闭的时候,找到这几个导致内存溢出的线程,强制将其关闭。是不是在时机上已经迟了?

另外:我在部署另一个项目时候也碰到了与此相类似的问题。查阅资料后发现有很多相似的案例,但是却没有发现十分完美的解决方案。
。。。(正常部分)
重: Error filterStart
三月 13, 2017 10:47:27 上午 org.apache.catalina.core.StandardContext startInternal
严重: Context [/wf] startup failed due to previous errors
三月 13, 2017 10:47:27 上午 org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc
严重: The web application [/wf] registered the JDBC driver [com.alibaba.druid.proxy.DruidDriver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
三月 13, 2017 10:47:27 上午 org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc
严重: The web application [/wf] registered the JDBC driver [com.mysql.jdbc.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
三月 13, 2017 10:47:27 上午 org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
严重: The web application [/wf] appears to have started a thread named [Druid-ConnectionPool-Create-2101937136] but has failed to stop it. This is very likely to create a memory leak.
三月 13, 2017 10:47:27 上午 org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
严重: The web application [/wf] appears to have started a thread named [Druid-ConnectionPool-Destroy-2101937136] but has failed to stop it. This is very likely to create a memory leak.
。。。(正常部分)

这两个问题能算是同一个问题吗?
万分期盼您能拨空指点一下。

2017-03-09 12:48

@JFinal 谢谢大神。我加了一个Tomcat 的关闭监听事件,在tomcat关闭的时候,自己主动的将那几个线程给关闭了。设置它们为守护线程的时候不太行,显示不给修改。