美文网首页
为何java,c#提供了内存回收机制,仍然需要手动释放内存

为何java,c#提供了内存回收机制,仍然需要手动释放内存

作者: 最怕认真 | 来源:发表于2018-02-28 16:14 被阅读257次

    对于c++而言,我们new了一个对象,则需要在合适的时候去释放它,也就是delete它。
    但是对于c#和java。
    前者提供了CLR公共语言运行库(Common Language Runtime)后者有Java虚拟机,它们都具有垃圾回收的功能。
    既然如此,为何我们常常在写读写文件的时候,操作完毕都强调需要调用close来释放呢?
    在c#中,有将资源非为托管资源和非托管资源,从名字上来看,其实就是clr能够管理的资源就是托管资源,而不能管理的资源就是非托管资源。
    举个例子,你写一个person类,它是托管资源,你不手动释放,最终也会被回收,只是这个回收的时机是不确定的。
    而你调用文件读写,它涉及了计算机的其他资源,所以属于非托管资源,这部分资源,clr是无法触及的,所以我们必须手动去释放。
    相同的,java虚拟机也是一样的意思。
    c#的crl也好,java虚拟机也好,他们都有自己的管辖范围,他们只能对纯粹的属于自己管理的内存做管理,而涉及其他内核资源的东西,它们都无法回收。
    因此,我们经常看到c#中提供了idispose接口来让编程人员手动释放掉非托管资源。
    java中也是经常需要调用close来释放非托管资源(java中没有这种说法,但就是一样的意思)

    相关文章

      网友评论

          本文标题:为何java,c#提供了内存回收机制,仍然需要手动释放内存

          本文链接:https://www.haomeiwen.com/subject/lsfixftx.html