找出Java程序内存溢出的元凶 - 编程入门网
出Java程序内存溢出的元凶(2)
时间:2011-10-28 cuishen
下面是我解决具体问题的一些经验: 程序中造成内存溢出可能性最大的是HashMap,Hashtable等等集合类,尤其是静态的,更是要慎之又 慎!!!它们引用的对象可能你感觉已经销毁了,其实很可能你忘记remove键值,而如果这些集合对象还 是静态的挂在其他类里面,那么这个引用可能一直都在,借用JProbe测试一下,结果往往出人意料,解决 办法:彻底删除键,remove、clear,如果允许最好把集合对象设为null 对于不再使用的线程对象,如果要彻底杀了它,很多书上都推荐用join方法,我之前也是这样做的, 但后来借助JProbe工具我吃惊的发现这样做很可能要杀的线程仍旧好好的活在你日益增大的内存里,很可 能调用了线程的sleep方法后用join方法就会有点问题,解决办法:在join方法前再加一句执行interrupt 方法,不过这个时候可能会有新的问题:执行interrupt方法后你的线程类会抛InterruptedException, 上有政策下有对策,加一个开关变量做判断就能完美解决,可参考下面的代码: Java代码: /** * <p>Description: 创建线程的内部类</p> * @author cuishen * @version 1.1 */ class NewThread implements Runnable { Thread t; NewThread() { t = new Thread(this, path); t.start(); } public void run() { try { while(isThreadAlive) { startMonitor(); Thread.sleep(Long.parseLong(controlList.get (controlList.size() - 1).toString())); } } catch (InterruptedException e) { if(!ifForceInterruptThread) {//开关变量 stopThread(logThread); String error = "InterruptedException!!!" + path + ": Interrupted,线程异常终止!程序已试图重启该线程!!"; System.err.println(error); LogService.writeLog(error); createLogThread(); } } } } public void createLogThread() { ifForceInterruptThread = false;//开关变量 logThread = new NewThread(); } private void stopThread(NewThread thread) { try { thread.t.join(100); } catch (InterruptedException ex) { System.out.println("线程终止异常!!!"); } finally { thread = null; } } /** * 关闭并彻底释放该线程资源的方法 */ public void stopThread() { try { |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |