我有两个线程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在线程自己正常结束时会被自动销毁吗?难道不是?
{
读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在线程自己正常结束时会被自动销毁吗?难道不是?
我也只是以前不小心 看到过一点点关于内存释放 的知识 不知道记错了没。
public static void gc()运行垃圾回收器。
调用 gc 方法暗示着 Java 虚拟机做了一些努力来回收未用对象,以便能够快速地重用这些对象当前占用的内存。当控制权从方法调用中返回时,虚拟机已经尽最大努力从所有丢弃的对象中回收了空间。 调用 System.gc() 实际上等效于调用: Runtime.getRuntime().gc()
System.gc()强制运行内在回收...
所以上涨很正常啊
发帖数:16
结贴数:8
结贴率:50.00%如何结贴看这里:http://topic.csdn.net/u/20080501/09/ef7ba1b3-6466-49f6-9d92-36fe6d471dd1.html