`
dsxwjhf
  • 浏览: 73142 次
  • 性别: Icon_minigender_1
  • 来自: 安徽
社区版块
存档分类
最新评论

JIT 之方法内联

    博客分类:
  • JVM
阅读更多
本文主要摘自周志明《深入理解 Java 虚拟机: JVM 高级特性与最佳实践》

什么叫方法内联?
方法内联就是把目标方法的代码“复制”到发起调用的方法之中,避免发生真实的方法调用。

方法内联有什么好处?
1). 消除方法调用的成本,如无需再建立新的栈帧;
2). 为其它优化手段建立良好的基础,如无用代码消除等。

Java 虚拟机中方法内联面临的难题。
Java 虚拟机中的内联过程没有想象的那么简单。我们知道,只有使用 invokespecial 指令调用的私有方法、实例构造器和父类方法,以及使用 invokestatic 调用的静态方法,顶多再加上用 final 修饰的方法,才是在编译期进行解析的,它们称为非虚方法。除此之外, Java 中的其它方法都称为虚方法,对它们的调用需要在运行时进行方法接受者的多态选择,并且都有可能存在多于一个版本的方法接收者。对于一个虚方法,编译期做内联的时候根本无法确定应该使用哪个方法版本,需要在运行期才能确定。这也是在 Java 虚拟机中做内联比较困难的原因。

难题的解决方案: CHA 技术、守护内联和内联缓存。
CHA ,类型继承关系分析。它是一种基于整个应用程序的类型分析技术,用于确定在目前已加载的类中,某个接口是否有多于一种的实现,某个类是否存在子类,子类是否为抽象类等。
分享到:
评论

相关推荐

    InliningAnalyzer:内联分析器是Visual Studio扩展,它在源代码中显示JIT编译器是否内联方法调用-Show source code

    内联分析器(InliningAnalyzer)是一款专为Visual Studio设计的扩展工具,它的主要功能是帮助开发者洞察JIT(Just-In-Time)编译器对源代码中方法调用的内联处理情况。通过高亮显示代码,它使得开发人员能够直观地看到...

    Java动态绑定和内联

    JIT会分析方法的调用频率和复杂性,决定是否对方法进行内联优化。对于final方法和私有方法,由于它们不会被重写,JVM更倾向于进行内联,因为这样可以确保不会因动态绑定带来额外的开销。 总结来说,动态绑定是Java...

    jit JavaScript

    JIT的优化策略通常包括死代码消除、常量折叠、内联函数等。 JavaScript引擎如V8(Chrome和Node.js使用)、SpiderMonkey(Firefox使用)以及JSC(Safari使用)都实现了JIT技术。这些引擎在执行JavaScript时,会根据...

    用于查看Hotspot的JIT的汇编码 hsdis

    这有助于开发者理解JIT如何优化特定的Java代码,例如方法内联、逃逸分析等高级优化技术。 为了使用hsdis,开发者通常需要将相应的动态链接库或共享对象文件放到系统路径中,或者通过指定环境变量让Java虚拟机找到...

    RustChinaConf2020-18.周鹤洋-《用Rust设计高性能JIT执行引擎》.pdf

    此外,内联缓存是JIT优化中另一个关键概念,它加速了方法查找,提高了运行效率。 内存安全是Rust语言的一大亮点,在JIT执行引擎设计中尤为重要。通过Rust的类型系统和所有权模型,开发者可以避免常见的内存错误,如...

    cpp-ZetaVM一个用于动态编程语言的虚拟机和JIT编译器

    此外,其优化策略包括方法内联、循环展开、数据结构优化等,旨在提高代码执行效率。 ### 5. 社区与生态系统 ZetaVM作为一个开源项目,拥有活跃的社区支持,开发者可以通过参与讨论、提交代码和报告问题来共同推动...

    A Trace-based Java JIT Compiler Retrofitted from a Method-based Compiler

    - **追踪的形成与扩展**:形成更长的追踪比单纯的方法内联更为强大。这意味着编译器可以通过识别跨越多个方法的追踪来扩展编译范围,从而显著降低方法调用开销并提供更多优化的可能性。 - **性能提升与权衡**:尽管...

    Java JIT编译器概览.pdf

    - 方法内联:将小方法体直接插入调用者中,减少调用开销。 - 逃逸分析:识别对象是否能逃逸出当前作用域,优化内存分配和对象生命周期。 4. **分层编译**:现代JVM如Oracle的HotSpot JVM采用分层编译策略,从简单...

    性能飞跃的催化剂:揭秘Java JIT编译器的魔法

    在这个例子中,如果`print`方法被JIT编译器识别为热点代码,那么它可能会被内联到`main`方法中,从而减少方法调用的开销,提高程序的整体性能。 #### 性能监控和反馈 JVM提供了多种工具和技术用于监控JIT编译过程...

    hllvm.01.JIT编译以及执行native code的流程1

    优化包括了方法内联、常量折叠、死代码消除等。 3. 生成native代码阶段:在这个阶段,JVM会将优化后的中间表示生成为native机器代码。native代码可以直接在宿主机器上执行,提高程序的执行速度。 在HotSpot VM中,...

    大方法的执行性能与调优过程小记1

    此外,JVM还有其他优化手段,比如方法内联,可以提高代码执行效率,但这需要谨慎使用,因为过度的内联可能导致方法体过大,反而影响性能。 总结来说,大方法的性能问题主要是由于JVM的JIT编译策略限制。为了避免...

    Lua jit 2.10

    6. **使用 JIT 功能**:编写 Lua 代码时,可以利用 LuaJIT 的特性,比如使用类型检查和内联函数来最大化 JIT 的编译效果。 7. **性能调优**:利用 LuaJIT 提供的 `-jv` 和 `-jdump` 选项,你可以查看编译的 traces ...

    jitwatch:Java HotSpot JIT编译器的日志分析器可视化工具。 检查内联决策,热门方法,字节码和汇编。 在JavaFX用户界面中查看结果

    HotSpot JIT编译器的日志分析器和可视化工具。 JITWatch 视频介绍 我在JITWatch 上的LJC闪电演讲中的 有关说明和屏幕截图,请参见Wiki。 JITWatch用户界面是使用JavaFX构建的。 这包含在Oracle JDK中。 如果您...

    python语言的jit实现pypy 的原理

    内联缓存技术尤其重要,它通过缓存对象的运行时类型信息来加速方法调用。 Pypy团队的研发工作是开放的,社区可以参与到项目中来,共同改进和扩展Pypy的功能。Pypy提供了一系列的工具,比如垃圾收集器、性能分析器和...

    A C++ expression -> x64 JIT.zip

    8. **优化技术**: JIT编译器可能应用诸如循环展开、内联函数、死代码消除等优化策略,以提高C++表达式的运行速度。 9. **平台特定API**: 为了与操作系统交互,JIT编译的代码可能需要调用x64特定的系统API,如...

    你的Java代码对JIT编译友好么?

    JIT编译的一个重要策略是方法内联,它能减少虚方法调用的开销,提升执行效率。默认情况下,JVM会尝试内联长度不超过35个字节码的方法,对于高频调用的方法,这个阈值可提高至325个字节。 内联虽能显著提高性能,但...

    .NET如何快速比较两个byte数组是否相等.doc

    .NET 的 JIT 对一些方法默认是不做 inline 内联优化的,这样每次还有一个方法调用的开销。我们可以通过引入 System.Runtime.CompilerServices 命名空间,然后在方法上面打上头标记来让 JIT 去积极的进行内联。 另一...

    code-samples:Spidermonkey JIT的一些简单测试用例

    - **函数内联**:如果一个函数频繁被调用且体积较小,JIT可能会选择将其内联到调用者中,消除调用开销。 - **类型推测**:JIT会跟踪变量的类型,如果发现某个变量始终为同一类型,它会优化代码以使用特定类型的运算...

    一种基于Java虚拟机的动静结合自适应优化方法.zip

    当某个方法被频繁调用时,JVM会将其识别为“热点方法”,并启动即时编译器(Just-In-Time Compiler, JIT)将其转换为本地机器代码,以获得更快的执行速度。自适应优化则是根据程序运行情况动态调整优化策略,如当...

    lua_jit.rar

    同时,它还引入了一些独特的优化,如类型检查和内联缓存,这些都有助于提高性能。 8. **社区支持**:LuaJIT有一个活跃的社区,开发者们贡献了各种扩展和库,使得LuaJIT能更好地适应各种应用场景。官方文档详尽且...

Global site tag (gtag.js) - Google Analytics