内存回收机制的问题

内存回收是编程中需要注意的一个很重要的问题,虽然很不起眼,但是对整个程序却很有影响。C++语言中自己申请的内存需要自己的显式释放,智能指针也只能解决一部分的内存问题。Java中的内存自回收机制让程序员在编写应用层软件的时候得心应手,也越来越受到欢迎。现在的问题是,现阶段总共有哪些内存回收机制?Java中的GC的工作机制是什么?如何做到内存自动回收的?还有哪些内存回收机制?

Geo5
Geo5
463
编辑于2012-10-10
评论 (3)链接2012-10-09 
  • 0 支持
    好复杂的问题! – tlh1987 2012-10-09
  • 0 支持
    信息量很大! – 小伙子Paddle 2012-10-09
  • 0 支持
    <<Memory Management - Algorithms And Implementation In C>>可以解答部分问题 – liff-engineer 2012-10-12

现在的问题是,现阶段总共有哪些内存回收机制?Java中的GC的工作机制是什么?如何做到内存自动回收的?还有哪些内存回收机制?

1、从解放程序员双手和思想方面来说,内存回收(我更倾向于垃圾收集这个说法,毕竟是Garbage Collection)是必须的。显示内存管理从抽象性和模块化上对程序设计进行了一个明显的破坏,而自动内存管理则相对能更进一步的提供抽象。正如楼主所说的,“内存自回收机制让程序员在编写应用层软件的时候得心应手”。
现阶段共有那些内存回收机制?
比较经典的算法有:

  • 引用计数算法
  • 标记清扫算法
  • 节点复制算法

2、Java的GC使用的是分代式垃圾收集,针对不同得Generation选择使用“标记-清扫”或者是“节点复制”算法。
具体参考:Java垃圾回收器工作原理

3、内存回收的关键在于判断对象是否仍然能够起到作用,然后由此来确定是否保留或者释放相应的内存,无论是引用计数,标记-清扫,还是节点复制算法的本质都是在底层对对象的使用做分析,最后判断出结果后进行处理。

4、内存回收是一个(至少目前是)比较值得深入研究的领域。除了Java使用的分代式垃圾收集机制之外,还有

  • 渐进式垃圾收集
  • 并发式垃圾收集
  • 分布式垃圾收集

等等。而目前有针对性的相关资料不是很多,可以试着参考下:
《垃圾收集》

该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (0)链接 • 2012-10-11

Java我不清楚,C#我知道,Java应该也差不多吧:
自动回收首先只需要回收堆空间里的内存(也就是类似于C++的new分配的空间)。GC中有被称为LifeTimeService的服务,某些对象不管有没有人引用在一段时间内都是不允许回收的,比如进程、线程、App对象、还有全局静态变量和当前栈上引用的变量等,这些对象只有从LifeTimeService中移除之后(比如线程执行结束之后会自己将自己从LifeTimeService里面移走)才允许回收;其他对象在从这些不予回收变量有直接或间接引用的时候都不允许回收,当不存在从这些变量的直接或间接引用之后可以回收。
所有的对象在分配之后都有记录。有一个专门的低优先级的线程在后台运行,定期执行回收操作,当内存不足(只是预分配的堆内存不足,不是整个系统内存不足)的时候也会主动执行回收操作;回收的时候,算法是从不允许回收的变量开始,穷举所有的引用然后依次遍历,类似于有向图的深度优先遍历,遍历完成之后,所有没被遍历到的对象都会被回收。
实际的GC还有一些更复杂的机制,不过关于回收的基本算法就是这样了。详细内容

其他的自动管理机制,比较简单的有引用计数,就是每个变量保存被别人引用多少次,引用次数到0的时候就自动回收,php好像就是这样的机制。不过这个机制有个缺陷,如果两个对象循环引用(a引用b,b又引用了a),就会内存泄露。不过引用计数毕竟简单而且效率高。

该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (0)链接 • 2012-10-10
德问是一个专业的编程问答社区,请 登录注册 后再提交答案