bro*_*oke 6 vb.net memory dispose
有一天,当我意识到我几乎不知道清理我的资源时,我正在尝试在我的应用程序中摆脱一些内存泄漏的方法.我做了一些研究,并希望只需调用.dispose()即可解决我的所有问题.我们的数据库中有一个包含大约65,000条记录的表.显然,当我从数据适配器填充数据集时,内存使用率可能会非常高.当我在数据集上调用dispose方法时,我惊讶地发现没有内存被释放.为什么会这样?清除数据集也无济于事.
ang*_*son 26
IDisisposable因此Dispose不用于降低内存压力,虽然在某些情况下它可能,但用于确定性清理.
考虑这一点,您构造了一个对象,该对象维护与数据库服务器的活动和开放连接.此连接使用计算机和服务器上的资源.
你当然可以在你完成它之后离开对象,最终它会被垃圾收集器拾取,但是假设你想确保至少释放资源,从而关闭连接,当你完成它.这是IDisposable的地方.处置发挥作用.
它用于清理对象管理的资源.
但是,它不会释放分配给该对象的托管内存.这仍然留给垃圾收集器,它将在稍后的某个时间开始执行.
你真的有内存问题,或者你只是看看任务管理器或类似的内存使用情况,然后去"那有点高."?
如果是后者,那么你应该暂时离开它.如果你有更少的可用内存,.NET将更频繁地运行垃圾收集,所以除非你遇到的情况,或者可能怀疑你很快就会出现内存溢出情况,否则你可能不会遇到任何问题.
让我通过"少跑"来解释我的意思.
如果您的计算机中有8GB内存,并且只运行Windows和记事本,则大部分内存都可用.当您现在运行程序时,即使它将次要数据块加载到内存中,您也可以长时间保持这种状态,并且内存使用量将稳步增长.确切地说,当GC开始并试图减少你的内存占用时,我不知道,但我几乎可以向你保证,你会想知道为什么它变得如此之高.
让我们只是为了争论说你的程序最终会使用2GB的内存.
现在,如果您在具有较少可用内存的计算机上运行程序,GC将更频繁地发生,并且将在下限启动,这可能使内存使用率保持在500MB以下甚至更低.
这里要注意的重要部分是,为了让您准确了解内存应用程序实际需要多少,然后您不能依赖任务管理器或类似的方法来测量它,您需要更具针对性的东西.