JIT编译器里面的“逃逸分析”(Escape analysis)
来源:互联网 发布:网络棋牌信息 编辑:程序博客网 时间:2024/05/18 02:54
逃逸分析是一种编译器后端优化技术,它不是局部优化,而是过程间分析,这意味着它会分析函数调用关系,以判断变量是否“逃逸”出当前作用域范围。
对于JIT类语言来说,一般对象总是堆上分配,逃逸分析是否意味着局部的未逃逸的对象可以改成栈上分配呢?不是这样的,至少对于JVM不是这样。
另外一个有趣的例子是Go语言,写惯了C/C++语言的代码会发现一个很奇怪的Go语言特性:当你return一个&{...}对象引用时,看起来似乎这个对象没有new,也不是Make出来的,但是由于return语句使得变量逃逸出了当前的函数作用域,实际上该对象变成堆上分配了。这里我很好奇的是,反过来,假如你new一个局部对象(对于Java语言来说,对象总是new出来的),但是没有return,或者逃逸出去,为什么不能改成栈上分配呢???
另外一个语言当然就是JavaScript(这里主要关注v8)了。JS在主流的浏览器内核里都是JIT引擎实现的,因此都引入了逃逸分析。我相信Java/JVM、Go、v8这3种语言的逃逸分析的实现多少有点不太一样。怎么个不一样法,这里我还无法回答。
注意,逃逸分析需要在SSA(静态单赋值)的IR指令架构上实现,同时由于是过程间分析(IPA),所以一般都是基于sea of nodes(node graph)的高级数据流图模型,而不是简单的AST codegen。
简单地就写这么多,等有了更多心得,再来总结吧。
阅读全文
0 0
- JIT编译器里面的“逃逸分析”(Escape analysis)
- 逃逸分析(escape Analysis)
- 逃逸分析(escape Analysis)
- 逃逸分析(Escape Analysis)
- 什么是逃逸分析(Escape Analysis)?
- JVM优化之逃逸分析(Escape Analysis)
- JVM优化之逃逸分析(Escape Analysis)
- JVM的栈上分配与逃逸分析(Escape Analysis)
- 逃逸的小球(BALL Escape)
- RyuJIT:下一代的JIT编译器
- JVM的即时编译器JIT
- 探讨JVM的JIT 编译器
- 关于java JIT(即时编译器)的基本认识
- java虚拟机的逃逸分析
- JIT编译器
- JIT编译器
- 逃逸分析
- 逃逸分析
- DOM中的事件
- Android N 的开机启动流程概述
- HashMap的工作原理
- Koa2-下载-文件流
- JNI手动释放内存(避免内存泄露)
- JIT编译器里面的“逃逸分析”(Escape analysis)
- POJ 1617
- 前端的小玩意(16)——利用setter和getter实现数据校验
- STL VECTOR方法
- Windows下使用CMD命令复制多层级目录
- python 多线程 实现端口扫描
- JavaWeb三大技术之Filter
- Python学习笔记 5
- JavaScript—在嵌套的内部函数中调用外部this的方法