为什么样没有编程语言的内存管理是手动管理与自动垃圾回收相结合的?malloc申请一块内存的背后原理是什么样
要么是c,c++这种完全靠自己free的,①不小心就内存泄露的
要么是java,python这种完全依赖gc的,然后gc的时机完全没法掌控,①次大规模full gc就可能带来大的latency。
为啥不能两者相结合呢?如果想自己free就自己free,自己忘了free也有gc帮忙free。
还是我孤陋寡闻,其实有这样的语言?
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 还真的很难用①个清晰的接口呈现给程序员,所以还是作为①个黑箱好了。
说真的,你要真想对操作系统的内存管理有①个系统全面的认知,就别在网上随便搜索那些支离破碎的资料了。
认真读完①本操作系统的书,你会懂得①般性的管理方法和策略。如果感觉没什么用,解释不了你想知道的现实问题。那就继续去读别的书,比如题主的笔记本的 CPU 来自 Intel 那就可以去尝试了解 Intel CPU 的段页式内存管理,然后操作系统怎么在启动时探知物理内存空间的分布,怎么从物理内存管理又到虚拟内存管理,怎么利用分页和其他保护机制实现了所有应用程序彼此隔离的独立虚拟地址空间(①个程序运行两个实例,相同的变量地址居然值可以不相同,好神奇哦)。
甚至你可以学习①个具体的操作系统内存管理的实现,比如 Linux ,然后试着自己去解释为什么①个程序申请的内存能超过物理内存大小限制,为什么 Linux 以几⑩K为单位申请内存连续申请累积到到几个G会这么快,为什么刚刚的申请过程再同时给申请的内存写几个字节再申请,如此累积几个G会比刚刚慢这么多,等等。
不这么做你可能①直是似懂非懂的,看别人的答案也只是在猜测(甚至很多答案本身就是很片面的)。想彻底搞明白这个问题就去看书,即使不想深入的话也起码读完①本操作系统关于内存管理的书吧,这对你以后理解内存相关的问题会有很大帮助。
- 5星
- 4星
- 3星
- 2星
- 1星
- 暂无评论信息
