线程占用内存的问题

CONGCONG1105 2011-06-03 01:19:23
我定义了一个窗体线程变量
Private myWriteFileThread As Thread

在timer的Tick里进行如下操作:
If myWriteFileThread IsNot Nothing Then
myWriteFileThread.Abort()
myWriteFileThread = Nothing
End If
myWriteFileThread = New Thread(AddressOf WriteInsFile)
myWriteFileThread.Start()

发现内存占用一直在升高,有什么方法可以解决吗?
...全文
157 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
cosmo_sei 2011-06-09
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 congcong1105 的回复:]
引用 8 楼 ilooknow 的回复:
'不需要频繁重新定义myWriteFileThread
If myWriteFileThread Is Nothing Then
myWriteFileThread = New Thread(AddressOf WriteInsFile)
myWriteFileThread.Start()
End If

'另外 WriteInsFile中可……
[/Quote]

线程创建很平凡的话,用线程池。(2楼就说过啦)
给个参考资料
http://msdn.microsoft.com/zh-cn/library/3dasc8as.aspx
music_0000 2011-06-08
  • 打赏
  • 举报
回复
SLEEP
CONGCONG1105 2011-06-07
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 ilooknow 的回复:]
'不需要频繁重新定义myWriteFileThread
If myWriteFileThread Is Nothing Then
myWriteFileThread = New Thread(AddressOf WriteInsFile)
myWriteFileThread.Start()
End If

'另外 WriteInsFile中可加如thread.sleep(1……
[/Quote]

不重新定义的话怎么做呢?
Tosp2012 2011-06-03
  • 打赏
  • 举报
回复
GC.Collect()回收一下垃圾試試。
MSDN811914 2011-06-03
  • 打赏
  • 举报
回复
学习学习...
ilooknow 2011-06-03
  • 打赏
  • 举报
回复
'不需要频繁重新定义myWriteFileThread
If myWriteFileThread Is Nothing Then
myWriteFileThread = New Thread(AddressOf WriteInsFile)
myWriteFileThread.Start()
End If

'另外 WriteInsFile中可加如thread.sleep(10)之类的语句
cosmo_sei 2011-06-03
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 congcong1105 的回复:]
引用 2 楼 cosmo_sei 的回复:
1 确认下这个WriteInsFile是否使用了非托管资源,如果有则需要显式释放。

2 垃圾回收没有执行之前,内存占用不会释放掉,你可以等待一下垃圾回收或者显式调用GC.Collect()回收,看看内存是否释放了。

3 这个操作非常频繁的话,建议用线程池。


非托管资源是什么意思啊?
[/Quote]

有些对象的数据不在托管堆中,不会被GC自动回收。如文件操作,其文件锁是由操作系统维护的,若没有显式释放(比如调用Close()方法),即使你将对象设为null,文件锁依然存在直到你关闭进程。

若你将方法清空仍有此问题,我估计最有可能的是GC没有执行清理,若可以你等待足够长的时间,让GC执行过清理,看看内存消耗是不是稳定在一个区间内,比如开始消耗10M,5分钟后消耗20M,但8分钟后又恢复10M。

GC的清理策略很难估计。试试调用 GC.Collect()执行清理。
smarterror 2011-06-03
  • 打赏
  • 举报
回复
学习学习...
CONGCONG1105 2011-06-03
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 cosmo_sei 的回复:]
1 确认下这个WriteInsFile是否使用了非托管资源,如果有则需要显式释放。

2 垃圾回收没有执行之前,内存占用不会释放掉,你可以等待一下垃圾回收或者显式调用GC.Collect()回收,看看内存是否释放了。

3 这个操作非常频繁的话,建议用线程池。
[/Quote]

非托管资源是什么意思啊?
CONGCONG1105 2011-06-03
  • 打赏
  • 举报
回复
我做了一个试验,同样的操作,只不过把函数里的东西全部清掉了,也就是每次调用的是一个空函数,内存还是上升
cosmo_sei 2011-06-03
  • 打赏
  • 举报
回复
还有,确认这个WriteInsFile的执行时间,如果是个while true循环或者要执行很久,则线程不会结束,timer每次tick都会new一个新进程,进程数就越来越多了。

我觉得问题主要是在 WriteInsFile 上。
cosmo_sei 2011-06-03
  • 打赏
  • 举报
回复
1 确认下这个WriteInsFile是否使用了非托管资源,如果有则需要显式释放。

2 垃圾回收没有执行之前,内存占用不会释放掉,你可以等待一下垃圾回收或者显式调用GC.Collect()回收,看看内存是否释放了。

3 这个操作非常频繁的话,建议用线程池。
CONGCONG1105 2011-06-03
  • 打赏
  • 举报
回复
大家都去午休了?

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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