关于线程运行几次后内存上升问题,请各位达人相帮

TGITCIC
Java领域优质创作者
博客专家认证
2008-05-29 02:22:37
我有两个线程

WorkThread

WatchThread

都是

extends Thread面来

WorkThread
{
读1000条记录,插入数据库
}

WatchThread{
While(TotalRecord<0){
if (WorkThread== null || !WorkThread.isAlive()) {
WorkThread= new WorkThread
WorkThread.start();
WorkThread.join();
try{
WorkThread.interrupt();
}catch(Exception e){ }
WorkThread= null;
}
}
}

我已经在WorkThread里排查过了,没有任何内存等问题,内存值是平线
问题出在WatchThread上
每次While循环里的一个workthread做完后,再new一个workthread时,内存就会上升10MB

每个WorkThread做10000条数据导入,TotalRecord-10000,

如果TotalRecord=50000,正好这个线程运行完,内存上涨了50MB

我在linux下的tomcat里运行的,监视内存用的是top命令

看到TOMCAT的进程的 res值做完10000条,开始new一个新的workthread时就涨10MB。

问题时,我不是已经interrupt和=null了吗?而且此时我已经监测过workthread在join()命令后确实是已经运行完了

不是说JAVA在线程自己正常结束时会被自动销毁吗?难道不是?
...全文
190 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
humcomm 2008-05-30
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 nanjg 的回复:]
new 是很大开销的 建议加进模式``
[/Quote]

线程的创建和销毁确实很费资源
nanjg 2008-05-30
  • 打赏
  • 举报
回复
new 是很大开销的 建议加进模式``
simonn88 2008-05-30
  • 打赏
  • 举报
回复
垃圾收集是需要时间的 建议你在WatchThread循环里等个0.1秒 再看看内存变化
jdlsfl 2008-05-29
  • 打赏
  • 举报
回复
java中jvm的内存释放并不是实时的
就算调用System.gc()方法也只是提醒系统释放内存,并不是立即就起作用的
所以会出现你上面讲的现象
对此我们没有办法,只能等jvm空闲的时候回收
Shine_Panda 2008-05-29
  • 打赏
  • 举报
回复
JVM 销毁 对象不是立即的。 当JVM 并未面临内存毫尽的情况下 它不会去浪费时间执行垃圾回收,GC 只有在比较空闲或JVM内存不足的时候才去清理那些没有引用指向的对象。

更多请搜索:GC的工作原理
lydiablo 2008-05-29
  • 打赏
  • 举报
回复
我听说垃圾收集器对线程一向无可奈何!!

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧