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

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

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在线程自己正常结束时会被自动销毁吗?难道不是?
...全文
165 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
zs742946530888 2011-05-31
  • 打赏
  • 举报
回复
串口异常断开,内存不停的增加
zy2419 2008-06-17
  • 打赏
  • 举报
回复
垃圾回收没那么快吧,最好自己让他回收掉
老紫竹 2008-06-16
  • 打赏
  • 举报
回复


楼主截止到2008-06-16 19:54:31的汇总数据:
发帖数:16
结贴数:8
结贴率:50.00%

如何结贴看这里:http://topic.csdn.net/u/20080501/09/ef7ba1b3-6466-49f6-9d92-36fe6d471dd1.html
sagezk 2008-06-16
  • 打赏
  • 举报
回复
问题在 WorkThread.interrupt(); 这句,这句不会杀掉线程而只是给线程设置了一个中断标志。
zspsys 2008-06-16
  • 打赏
  • 举报
回复
哦 学习了 不是用完了以后要关闭么?没见Lz关闭呀?
tanlingyun 2008-06-16
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 caoyinghui1986 的回复:]
JVM 销毁 对象不是立即的。 当JVM 并未面临内存毫尽的情况下 它不会去浪费时间执行垃圾回收,GC 只有在比较空闲或JVM内存不足的时候才去清理那些没有引用指向的对象。

更多请搜索:GC的工作原理
[/Quote]
jdlsfl 2008-06-16
  • 打赏
  • 举报
回复
jvm的垃圾回收不是及时的
longtramp 2008-06-16
  • 打赏
  • 举报
回复
就算是使用System.gc()JVM也不会立即就进行垃圾回收
所以上涨很正常啊
hnjd314053754 2008-06-16
  • 打赏
  • 举报
回复
学习咯
zwgs1985 2008-05-29
  • 打赏
  • 举报
回复
停一会就回收干净了
GC不及时回收
duzhonghua 2008-05-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 huang005x 的回复:]

public static void gc()运行垃圾回收器。
调用 gc 方法暗示着 Java 虚拟机做了一些努力来回收未用对象,以便能够快速地重用这些对象当前占用的内存。当控制权从方法调用中返回时,虚拟机已经尽最大努力从所有丢弃的对象中回收了空间。

调用 System.gc() 实际上等效于调用:

Runtime.getRuntime().gc()
[/Quote]

System.gc()强制运行内在回收...
老紫竹 2008-05-29
  • 打赏
  • 举报
回复
上涨很正常,垃圾回收不是实时。
风影枫林 2008-05-29
  • 打赏
  • 举报
回复

public static void gc()运行垃圾回收器。
调用 gc 方法暗示着 Java 虚拟机做了一些努力来回收未用对象,以便能够快速地重用这些对象当前占用的内存。当控制权从方法调用中返回时,虚拟机已经尽最大努力从所有丢弃的对象中回收了空间。

调用 System.gc() 实际上等效于调用:

Runtime.getRuntime().gc()
风影枫林 2008-05-29
  • 打赏
  • 举报
回复
据说 让系统 自动释放内存 不是很安全 所以 能自己释放的时候 最好还是自己手动释放

System.gc(); 这个方法 好像是用来强制释放内存的。


我也只是以前不小心 看到过一点点关于内存释放 的知识 不知道记错了没。
Shine_Panda 2008-05-29
  • 打赏
  • 举报
回复
JVM 销毁 对象不是立即的。 当JVM 并未面临内存毫尽的情况下 它不会去浪费时间执行垃圾回收,GC 只有在比较空闲或JVM内存不足的时候才去清理那些没有引用指向的对象。

更多请搜索:GC的工作原理
jianghuxiaoxiami 2008-05-29
  • 打赏
  • 举报
回复
学习

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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