首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > VB Dotnet >

关于vb.net 设置对象为nothing 的有关问题请大家讨论,来着有分

2012-03-19 
关于vb.net 设置对象为nothing 的问题请大家讨论,来着有分上面是界面下面的代码虽然长,但是很简单VB.NET c

关于vb.net 设置对象为nothing 的问题请大家讨论,来着有分

上面是界面
下面的代码虽然长,但是很简单


VB.NET code
Public Class Form1    Public hs As Hashtable    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click        Dim testStr As String = ""        hs = New Hashtable        Dim j As Integer = 0        For j = 0 To 1000            testStr = testStr & "这里是测试的字符串目的是占用内存看出内存变化===========,岸上的风斯蒂芬空间上的你海岸上的风斯蒂芬空间上的考虑房价松动风流酷似地方你海岸上的风斯蒂芬空间上的你海岸上的风斯蒂芬空间上的考虑房价松动风流酷似地方你海岸上的风斯蒂芬空间上的你海岸上的风斯蒂芬空间上的考虑房价松动风流酷似地方你海岸上的风斯蒂芬空间上的考虑房价松动风流酷似地方"            hs.Add(j, testStr)        Next        '请查看内存因为创建了一个很大的对象,所以内存狂飙到150-200mb之间了    End Sub    '设置hs为nothing ,测试看看设置之后内存是否立即就释放掉了    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click        hs = Nothing        '很遗憾通过任务管理器并没有发现内存降下来        '请大家说说为什么这里  到底释放了对象还是没有释放?    End Sub    '查看对象的长度    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click        If hs Is Nothing Then            MsgBox("对象为空了")        Else            MsgBox("现在有记录数量:" + hs.Count)        End If    End Sub    '使出杀手锏,虽然很多资料里不让用,这个方法,但是的确点击后 内存一下子就降了下来    Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click        GC.Collect()        '内存一下子恢复到了5-7mb之间    End Sub    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load        '现在是初始化状态内存大约在5-7 mb之间    End SubEnd Class




[解决办法]
GC 垃圾回收,是程序自动清理的,时间跟大小都不确定.

手动强制回收也是可以的.

频繁垃圾回收会因为不断的遍历对象造成效率低下.

但LZ这种状况是必须手动强制回收.

现在电脑都很快地,只要不是1秒回收几百次,都没什么.


[解决办法]
你可以这样写

Private Sub BtnEnd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnEnd.Click
Me.Close()
End Sub

Private Sub Form1_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
Me.Dispose()
End Sub
[解决办法]
这是两类内存管理机制的不同特性

1)即时释放
以 VB6、VC 为代表,内存直接通过系统调用完成,立即释放。
优点是内存耗用量是实时的,释放的内存可以马上被利用。
缺点是系统调用频繁,而且容易出现内存碎片。

2)采用垃圾回收机制
以 Java、.Net 为代表,多出一个垃圾回收器进行自己的内存管理。
对象释放时只是打上作废标记,定期进行批量释放。
优点是减少了系统调用,并且批量释放可以减少内存碎片。
缺点是内存耗用往往超过实际用量,对象释放后内存不能马上被利用。
[解决办法]
将对象设置为Nothing是为了通知垃圾回收器可以回收该对象所使用的空间了,但是在何时回收这是连系统都不能确定的事情。一般来讲,当系统在下次分配可用内存时,如果连续内存段不够,会强制使用垃圾回收器。

所以,我认为Nothing只是为要进行GC.College的对象设置了一个标志位。

不推荐频繁使用System.GC.College来回收。

热点排行