自动内存管理技术的思考
我是一个学过一点c++语言的人。在c++中,没有自动内存管理,却有很多可以值得借鉴的思路。
我认为一个内存,申请了,却不用,然后,不用了,却不释放,都是一种资源浪费,而不是说,程序最终都会在某一个时刻回收释放就叫防止内存泄漏了。就算有一小部分内存我是永远都用不上,泄露了,而相对有大部分内存不能好好利用上,那个更加不合理?因此,内存泄露是很广义的,程序应该协调好,提高内存利用才是正道。
.net框架的内存管理问题,在于对释放点的不确定,宏观的管理有时候是好的,但是程序往往有局部性,对细颗粒的控制往往是稳定性和性能的关键。至于如何提高这些内存的利用率,我觉得还是c++那套实在,什么时候用,什么时候申请,什么时候不用,什么时候释放。
在函数的的变量,是在栈中申请的,会在函数结束后,完成释放。这是一个内存管理的典范。
而建立在堆上的动态申请的内存,才是万恶的根源。当然,动态内存是有很多使用价值的。c++的做法是利用类的机制,创建的时候申请内存,消亡的时候释放内存,非常有效。虽然默认是手工实现,但是也能使用点技术手段达到自动管理。
真正的问题在于类的对象成员。对象成员可以指向自身,也可以指向另一个对象,那个对象又有对象成员指向出发对象,等等而形成一个回路。
因此,总结导致复杂性的问题根源在于:
1.对象(如.net 的类实例,而不是结构实例)
2.对象的对象成员
3.对象的对象成员的类延伸出去,最终在某个类有兼容出发类型的成员对象。
这些是必要而不是充分的条件。但是从这些条件,改进编译器,让其识别出来,也能够简化不少情况的处理。
然后让我们直面惨淡的对象回路问题吧。
对象回路在结构上来说,类似有多个根节点,然后加一个有向网路,网路节点可能还有一些没有回路的枝叶。
释放的条件是:
1.根节点等于0整个结构释放
2.任意一节点的引用计数等于0,释放该节点和减少后继结点计数