00:00
接管型乱探的编程语言如何?管内存的知事基本就2种,解释型新手管编译型偷偷改,欢迎来到蛋先生说事听不懂算我的。上回咱们把内存翻车的根源捋了一遍,最后得出一个结论,又根治,光靠程序员小心翼翼的自觉不是太行,还得靠接管型runtime把内存的分配、访问、释放给一手包办了。那Runtime具体是怎么包办的呢?咱按主要的执行方式先把它们分成两大类,这解码解释型和机器码编译型。这里说明一下,这里纯粹是为了讲原理做的分类,实际上不少现代语言是混合的,比如Java就结合了解释型和j ITT编译型。这两类差别在哪里呢?有的语言程序跑的是字解码,而自解码指令的具体实现都在runtime里,有他一条一条解释执行,你想想,既然每条指令都是他亲自执行的,内存管理自然也就由他直接上手管了,这就是字解码解释型,接下来简称解释型,那机器码编译型呢?
01:14
它就稍微麻烦一点,代码被直接编译成CPU能执行的机器码,CPU自己就能按顺序哗哗的跑了。执行指令流本身压根就不需要run time来调度,那内存分配怎么办?Runtime想接管只能换一招替换用户代码总结一下就是一个我直接管,一个我偷偷改。咱先看直接管的解释型,先掰扯清楚解释这俩字,他解释的是自解码所描述的指令字解码不是机器码指令,CPU不认得,由runtime来解释执行。接下来咱们按照这条链路从头到尾串一遍,看看runtime是怎么通过解释管理内存的。先来看这一句简单的代码,写Java的没人不认识吧,不写Java的也应该眼熟,毕竟个语言的语法都大差不差,就这一行其实暗含三步,现在对。
02:14
但申请一块能装下复实力的内存,再多用构造方法初始化,最后把对象引用就给变量for。有没有发现申请内存这件事,程序员甚至都可以完全不关心,因为真正动手的事j vm runtime. 那这行源码接下来都要经历哪些环节呢?第一步编译器会是按语法规则把它解析成一棵树,语义没变,但结构化了,这就是AST抽象语法数。刚才那句代码大自然这样看到没,结构一出来,机器处理起来就顺手多了。还记得上回咱们说过的吗?为了避免反复便利这棵树的开销得把它怎么样?没错,把它拍平成可执行的自解码指令编译器接着把这棵树拍平成runtime认识的语言字解码。刚才那句源码大致就对应这几条JVN字解码。
03:14
看到没?这几条里依然没有一条显示的申请内存指令,申请内存的逻辑其实就藏在new指令的时线里,那咱就瞧一瞧这款型,Runtime会预先为每一条自解码指令小好解释逻辑。New的实现大致长这样,看到了吧,申请内存触发GC全在这一小段实现里,堆不够了就先清理,在分配主动权全在他手里,到这思路就通了,New food本质上只是往runtime那儿递了张我优个food的申请单,后面怎么处理全由runtime接管。真正的内存申请动作被完整封装在runtime解释器里,他不把这套逻辑交给用户,内存的分配释放节奏就完全在他的掌控之中。这就是解释行李接管的真相,把主流程串起来就是这样。
04:14
至此,解释型拿下,那编译型咋整像够那样源码直接编译成机器码,CPU自己就能执行,根本用不着runtime的调度。那它又是怎么接管内存的呢?这就得换思路了。Runtime闪接管只能在生成机器码这个环节做手脚,甭管是AOT还是GI ITT编译器在生成机器码时都知道run ten的内存分配接口,于是会在new food这些地方自动植入内存管理的代码,相当于t runtime在用户代码里进行买点。接下来还是拿那句new food代码来演示,方便跟刚才的解释型对比着看。最常见的情况是当前现城私有的ta lab, 也就是现城本地分配缓冲区里还有空余ta ABB又是什么呢?我这么说吧,假设你已为人父母,你可能会给孩子一点零花。
05:14
钱,他买小零食的时候就不会每次都跑回来找你要了,自己兜里的小零钱就足够了,把你比作乱探,那ta ABB就是你提前塞给孩子的零钱。这种小额分配比较简单,编译器就索性把分配展开成几行,机器嘛,直接插进你的方法提里。没错,整个申请内存的过程就是这几行CPU指令,所以它叫内敛块路径。但注意啊,这块内存可不是用户自己拿的,他来自乱探提前塞给县城的零钱,乱探只是把最频繁的小额分配预售权给了县城,让他几纳秒内自己划完,省去每次分配都要进乱套的开销,那又是额度不够用呢?孩子零花钱不够,不就得回来找你吗?所以这次分配就要被替换成一次真正的函数调用,直接靠近乱time的。
06:14
C加加代码里这就是慢路径,看着就是个普普通通的分配函数,对吧?但关键就在调用方式,这个call不是用户主动掉的,是编译器在生成机器码时替用户买好的。你写的明明还是那句new for, 机器码里却悄悄多了一次靠近乱探终于到了收尾的时间了,解释型指令的时限全在乱探,内存分配由他亲手操办,编异型机器码是由CPU直接执行,但靠内联分配加替换成函数调用内存照样被他管的死死的。一句话总结,甭管哪种姿势,核心就一条申请内存这个动作永远轮不到用户亲手来碰,这就是接管的全部真相了。最后留个小作业去翻翻你常用的编程语言,它背后是不是也藏着一个接管型乱探是?
07:14
解释型直接管,变异型,偷偷买点还是混合知识?评论区报上你的答案,好了,今天就聊到这了,拜拜。
我来说两句