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

对于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#提供了内存回收机制,仍然需要手动释放内存)