在上一篇文章中,小编为您详细介绍了关于《创维电视打不开主页了会是什么样原因?云储存可以取代硬盘么》相关知识。本篇中小编将再为您讲解标题为什么样没有编程语言的内存管理是手动管理与自动垃圾回收相结合的?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会比刚刚慢这么多,等等。
不这么做你可能①直是似懂非懂的,看别人的答案也只是在猜测(甚至很多答案本身就是很片面的)。想彻底搞明白这个问题就去看书,即使不想深入的话也起码读完①本操作系统关于内存管理的书吧,这对你以后理解内存相关的问题会有很大帮助。
编后语:关于《为什么样没有编程语言的内存管理是手动管理与自动垃圾回收相结合的?malloc申请一块内存的背后原理是什么样》关于知识就介绍到这里,希望本站内容能让您有所收获,如有疑问可跟帖留言,值班小编第一时间回复。 下一篇内容是有关《iOS 开发中有哪些良好的习惯可以防止内存泄露的产生?为什么样使用Xcode的instruments工具的Leaks检测内存泄露显示的是内存地址而不是方法名》,感兴趣的同学可以点击进去看看。
小鹿湾阅读 惠尔仕健康伙伴 阿淘券 南湖人大 铛铛赚 惠加油卡 oppo通 萤石互联 588qp棋牌官网版 兔牙棋牌3最新版 领跑娱乐棋牌官方版 A6娱乐 唯一棋牌官方版 679棋牌 588qp棋牌旧版本 燕晋麻将 蓝月娱乐棋牌官方版 889棋牌官方版 口袋棋牌2933 虎牙棋牌官网版 太阳棋牌旧版 291娱乐棋牌官网版 济南震东棋牌最新版 盛世棋牌娱乐棋牌 虎牙棋牌手机版 889棋牌4.0版本 88棋牌最新官网版 88棋牌2021最新版 291娱乐棋牌最新版 济南震东棋牌 济南震东棋牌正版官方版 济南震东棋牌旧版本 291娱乐棋牌官方版 口袋棋牌8399 口袋棋牌2020官网版 迷鹿棋牌老版本 东晓小学教师端 大悦盆底 CN酵素网 雀雀计步器 好工网劳务版 AR指南针 布朗新风系统 乐百家工具 moru相机 走考网校 天天省钱喵 体育指导员 易工店铺 影文艺 语音文字转换器