加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – JIT编译代码驻留在哪里?

发布时间:2020-12-14 05:37:19 所属栏目:Java 来源:网络整理
导读:所以我有这个用 Java编写的方法: public void myMethod(int y){ int x = 5 + y; doSomething(x);} 并假设我的应用程序调用了很多次.. 在Java虚拟机上运行此方法的已编译代码时,JVM将首先解释该方法.然后经过一段时间后,如果我理解正确,它将决定将其编译为机
所以我有这个用 Java编写的方法:
public void myMethod(int y){
    int x = 5 + y;
    doSomething(x);
}

并假设我的应用程序调用了很多次..

在Java虚拟机上运行此方法的已编译代码时,JVM将首先解释该方法.然后经过一段时间后,如果我理解正确,它将决定将其编译为机器语言.

在此刻,

是否会被内存中的机器代码覆盖?如果它被覆盖,那么尺寸差异的问题将如何解决?如果它被写入内存中的其他位置,那么加载到内存中的字节码是否会被释放?而且,如果字节码和jit编译的代码都在内存中,当应用程序再次遇到此方法时,JVM如何决定执行jit编译代码而不是字节代码?

解决方法

HotSpot JVM在Metaspace中具有 Method结构(或早期版本中的PermGen).
它包含永远不会被覆盖的方法字节码和 a pointer to compiled code,在编译方法之前最初为NULL.

方法可能有多个入口点:

> _i2i_entry – 指向字节码解释器的指针.
> _code-> entry_point() – JIT编译代码的入口点.编译方法驻留在CodeCache中 – VM动态生成代码的本机内存的特殊区域.
> i2c和c2i适配器从解释器调用编译的代码,反之亦然.这些适配器是必需的,因为解释的方法和编译的方法具有不同的调用约定(如何传递参数的方式,如何构造帧等)

在某些极少数情况下,编译后的方法可能会有不常见的陷阱,这些陷阱会回溯到解释器.此外,Java方法可以多次动态重新编译,因此JVM不能丢弃原始字节码.无论如何都没有意义释放它,因为字节码通常比编译的代码小得多.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读