为什么没有编程语言的内存管理是手动管理与自动垃圾
2018-01-29 · 知道合伙人数码行家
huanglenzhi
知道合伙人数码行家
向TA提问 私信TA
知道合伙人数码行家
采纳数:117538
获赞数:517190
长期从事计算机组装,维护,网络组建及管理。对计算机硬件、操作系统安装、典型网络设备具有详细认知。
向TA提问 私信TA
关注
展开全部
C/C++ 完全靠手动这个容易解释 —— 总有对性能和 predictability 需求极高的场合。
至于其它语言,我并不认为有完美的解决方案。主要的考虑是 latency 和 overhead。一次回收大量垃圾,自然总 overhead 最小,但是 latency 就高了。一次回收一小部分,latency 比较低,但是总的 overhead 比较大。这中间的权衡需要在 runtime 收集信息来总体裁断,编写代码的时候静态考虑的效果并不好。所以现代 GC 的原则就是说:我知道所有信息,我有启发式的算法,可以保证总体效率。不希望让程序员干涉。
而且,有 GC 的语言,数据的生命周期并不好判断:一是语言会避免像 C/C++ 那样做 value copy,二是经常用在 undeterministic 的场合(UI、event-driven)。这种时候,让 GC 本身根据 global knowledge 来做分代,可能比程序员自己分析要好。
Java 规范里规定 System.gc( ) 只是一个 hint,这个我觉得多少有些太自负了。Lua 的 collectgarbage 是可以确定的调用 GC 的。但是也只是选择 GC 调用的时机,因为 GC 拥有整体内存的 knowledge,这个 global knowledge 还真的很难用一个清晰的接口呈现给程序员,所以还是作为一个黑箱好了。
至于其它语言,我并不认为有完美的解决方案。主要的考虑是 latency 和 overhead。一次回收大量垃圾,自然总 overhead 最小,但是 latency 就高了。一次回收一小部分,latency 比较低,但是总的 overhead 比较大。这中间的权衡需要在 runtime 收集信息来总体裁断,编写代码的时候静态考虑的效果并不好。所以现代 GC 的原则就是说:我知道所有信息,我有启发式的算法,可以保证总体效率。不希望让程序员干涉。
而且,有 GC 的语言,数据的生命周期并不好判断:一是语言会避免像 C/C++ 那样做 value copy,二是经常用在 undeterministic 的场合(UI、event-driven)。这种时候,让 GC 本身根据 global knowledge 来做分代,可能比程序员自己分析要好。
Java 规范里规定 System.gc( ) 只是一个 hint,这个我觉得多少有些太自负了。Lua 的 collectgarbage 是可以确定的调用 GC 的。但是也只是选择 GC 调用的时机,因为 GC 拥有整体内存的 knowledge,这个 global knowledge 还真的很难用一个清晰的接口呈现给程序员,所以还是作为一个黑箱好了。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询