首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么时候JVM会使用本质

什么时候JVM会使用本质
EN

Stack Overflow用户
提问于 2013-11-10 16:49:56
回答 2查看 7.3K关注 0票数 21

为什么出现在JVM内部类中的某些代码模式被转换为一个内部函数,而从我自己的类中调用的相同模式却不是。

示例:

bitCount函数,当从Integer.bitCount(i)内部调用时,将被转换为内部函数。但是,当复制到我的类,然后调用将需要更长的时间来执行。

比较

代码语言:javascript
复制
Integer.bitCount(i) 
MyClass.bitCount(i) 


public static int bitCount(int i) {
    // HD, Figure 5-2
    i = i - ((i >>> 1) & 0x55555555);
    i = (i & 0x33333333) + ((i >>> 2) & 0x33333333);
    i = (i + (i >>> 4)) & 0x0f0f0f0f;
    i = i + (i >>> 8);
    i = i + (i >>> 16);
    return i & 0x3f;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-10 16:55:58

答案很简单:通过这种方式定义了一个内在函数,因为存在一种获得函数结果的更快、更本地的方法,并且在特定映射的情况下应用它。

这和编译一点关系都没有。Integer.bitCount是特殊的,因为使用本机asm指令POPCNT将实现标记为可替换。基本上,本机指令在使用Integer.bitCount函数时使用(如果CPU支持该指令),当您声明自己的函数副本时,将使用正常的实现。

为什么JVM能够识别函数可以被优化呢?因为它是JDK中硬编码的某处,这与代码的相似性无关。

票数 32
EN

Stack Overflow用户

发布于 2013-11-10 16:57:56

JVM有一个方法列表,通常是本机方法,这些方法被内联的机器代码替换。这个列表出现在OpenJDK的内部头文件中,尽管我在web上找不到到它的链接。

参见链接@Jack提供的vmSymbols.hpp中的第581行

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19892322

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档