我有两个线程WorkThreadWatchThread都是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在线程自己正常结束时会被自动销毁吗?难道不是?

解决方案 »

  1.   

    JVM 销毁 对象不是立即的。  当JVM 并未面临内存毫尽的情况下 它不会去浪费时间执行垃圾回收,GC 只有在比较空闲或JVM内存不足的时候才去清理那些没有引用指向的对象。更多请搜索:GC的工作原理
      

  2.   

    据说  让系统 自动释放内存 不是很安全    所以  能自己释放的时候  最好还是自己手动释放System.gc();  这个方法  好像是用来强制释放内存的。
    我也只是以前不小心 看到过一点点关于内存释放  的知识    不知道记错了没。
      

  3.   


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

  4.   


    System.gc()强制运行内在回收...
      

  5.   

    就算是使用System.gc()JVM也不会立即就进行垃圾回收
    所以上涨很正常啊
      

  6.   

    jvm的垃圾回收不是及时的
      

  7.   

    问题在 WorkThread.interrupt(); 这句,这句不会杀掉线程而只是给线程设置了一个中断标志。
      

  8.   

    楼主截止到2008-06-16 19:54:31的汇总数据:
    发帖数:16
    结贴数:8
    结贴率:50.00%如何结贴看这里:http://topic.csdn.net/u/20080501/09/ef7ba1b3-6466-49f6-9d92-36fe6d471dd1.html