JVM内置函数Intrinsics介绍

目录
  • 1.什么是内置?
  • 2.JVM上的内置函数
  • 3.性能收益
  • 4.不可能的实现
  • 5.识别Java中的Intrinsics语言
  • 6.总结

1.什么是内置?

内置函数是由我们的编程语言的编译器或解释器进行特殊处理的函数。更具体地说,这是一种特殊情况,因为各种原因,编译器或解释器可以用替代实现替换函数。

编程语言通常通过理解一个特定的方法调用是特殊的来处理这个问题,无论何时我们调用这个方法,结果都是不同的。这样一来,我们的代码看起来与正常代码没有什么不同,但编程语言的实现可以在特殊情况下进行干预,以提供额外的好处。

它的具体工作方式因编程语言、操作系统和硬件而异。然而,由于这些都是为我们处理的,我们通常不需要知道这些细节中的任何一个。

本质可以带来各种好处。用本机代码替换特定算法可以使它们性能更好,甚至可以利用操作系统的特定功能或底层硬件。

2.JVM上的内置函数

JVM通过用替代版本替换精确类上的精确方法调用来实现内置函数。JVM自己处理这个问题,所以它只适用于核心类和特定的体系结构。它还只允许交换某些方法,而不是整个类。

具体的工作方式在JVM之间会有所不同。这不仅包括JVM的不同版本,例如Java 8和Java 11。这还包括不同的JVM目标——例如Linux和Windows——尤其是JVM供应商——Oracle和IBM。在某些情况下,传递给JVM的某些命令行标志可能会影响它们。

这种多样性意味着无法仅基于应用程序来确定哪些方法将被内置方法替换,哪些不会。这将根据运行应用程序的JVM而有所不同。但在某些情况下,这可能会导致令人惊讶的结果——包括通过简单地更改所使用的JVM而获得的显著性能优势。

3.性能收益

intrinsic通常用于实现同一代码的更高效版本,例如,通过利用正在运行的OS或CPU的实现细节。有时这是因为它可以使用更高效的实现,而有时它可以使用特定于硬件的功能。

例如:HotSpot JDK对java中的许多方法都有一个内在的实现java.lang.Math。根据具体的JVM,它们可能使用CPU指令来实现,以完成所需的精确计算。

一个简单的测试将证明这一点。例如,以java.lang.Math.sqrt()为例。

我们可以编写一个测试:

for (int a = 0; a < 100000; ++a) {
    double result = Math.sqrt(a);
}

此测试将执行100000次平方根运算,大约需要123ms。但是,如果我们用Math实现的副本替换这段代码。Math.sqrt():

double result = StrictMath.sqrt(a);

这段代码执行同样的操作,但执行时间为166ms。通过复制实现,而不是允许JVM用内部版本替换它,这将增加35%。

4.不可能的实现

在其他情况下,intrinsic用于代码无法在Java中实现的情况。这些通常是为非常低级的情况保留的。

例如,让我们看看java.lang.Thread线程类中的onSpinWait()方法。此方法表示此线程当前未执行任何工作,并且可以将CPU时间分配给另一个线程。为了实现这一点,它需要在尽可能低的水平上工作。

HotSpot JDK for x86体系结构使用PAUSE操作码直接在CPU上实现这一点。实现这一点的唯一其他方法是使用对本机代码的JNI调用,而这其中涉及的开销首先会抵消调用的好处。

5.识别Java中的Intrinsics语言

不幸的是,没有确定的方法来识别可能被内在版本取代的方法。这是因为不同的JVM,甚至是不同平台上的同一个JVM,会为不同的方法实现这一点。

但是,从Java 9开始使用HotSpotJVM时,所有可能被替换的方法都会使用@HotSpotInTrensicAndidate注释。添加此注释不会自动导致方法被替换。实际上,这种情况发生在底层JVM中。相反,JVM开发人员知道这些方法是特殊的,需要小心使用。

如果其他JVM被识别出来,它们可能会以不同的方式处理这个问题。这包括Java8或更早版本中的Hotspot JVM。

6.总结

我们无法编写依赖于内置函数存在的程序,因为无法知道它们是否在运行时JVM上可用。然而,它们是JVM可以用来改进程序工作方式的一种引人注目的方法。

这些内在特性可以——而且经常被——添加到新版本的JVM中。因此,只需升级我们正在运行的JVM,就可以改进我们已经运行的代码,所以这是确保我们保持依赖项和运行时最新的另一个原因。

到此这篇关于JVM内置函数Intrinsics介绍的文章就介绍到这了,更多相关JVM内置函数Intrinsics内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • JVM内存参数配置详解

    首先我们知道:JVM发生内存错误的类型 1.堆内存泄漏:OutOfMemory:Java heap space 此种内存泄漏,增加内存,只能暂时解决问题,并不能根治问题.必须要优化代码,一定是代码的问题:排查堆中的大量对象,就会发现,这些对象都被引用,对象不能及时被回收,导致超出了堆的设定最大内存. 2.老年代内存泄漏:OutOfMemoryError:PermGen space 类名.访问修饰符.字段描述.方法描述等,所占空间大于永久代最大值,就会出现,一般都是初始化内存的时候,空间太小,解决

  • 高分面试分析jvm如何实现多态

    目录 这样说,六十分 这样说,七八十分 昨天就有一个小伙伴被一道面试题虐了,我也给了他一定深度的答案.但是我觉得不够,我觉得应该让小伙伴们像我一样,答题能答出惊喜感,于是就有了这篇文章.我会从Java层面到Hotshot源码层面再到C++层面,完整分析这个问题. 这道面试题在好一些的互联网公司,尤其是一二线,问到的概率非常大,建议小伙伴们把这篇文章吃透. 这样说,六十分 多态是面向对象的三大特性之一,我个人认为,当时设计OOP机制的时候,能够想到多态的人,真特么太牛叉了. 多态理论第一次有了具体

  • JVM内置函数Intrinsics介绍

    目录 1.什么是内置? 2.JVM上的内置函数 3.性能收益 4.不可能的实现 5.识别Java中的Intrinsics语言 6.总结 1.什么是内置? 内置函数是由我们的编程语言的编译器或解释器进行特殊处理的函数.更具体地说,这是一种特殊情况,因为各种原因,编译器或解释器可以用替代实现替换函数. 编程语言通常通过理解一个特定的方法调用是特殊的来处理这个问题,无论何时我们调用这个方法,结果都是不同的.这样一来,我们的代码看起来与正常代码没有什么不同,但编程语言的实现可以在特殊情况下进行干预,以提

  • Python max内置函数详细介绍

    Python max内置函数 max(iterable, *[, key, default]) max(arg1, arg2, *args[, key]) Return the largest item in an iterable or the largest of two or more arguments. If one positional argument is provided, it should be an iterable. The largest item in the it

  • python中的内置函数getattr()介绍及示例

    在python的官方文档中:getattr()的解释如下: getattr(object, name[, default]) Return the value of the named attribute of object. name must be a string. If the string is the name of one of the object's attributes, the result is the value of that attribute. For examp

  • 浅谈使用Python内置函数getattr实现分发模式

    本文研究的主要是使用Python内置函数getattr实现分发模式的相关问题,具体介绍如下. getattr 常见的使用模式是作为一个分发者.举个例子,如果你有一个程序可以以不同的格式输出数据,你可以为每种输出格式定义各自的格式输出函数,然后使用唯一的分发函数调用所需的格式输出函数. 例如,让我们假设有一个以 HTML.XML 和普通文本格式打印站点统计的程序.输出格式在命令行中指定,或者保存在配置文件中.statsout 模块定义了三个函数:output_html.output_xml 和 o

  • python中的内置函数max()和min()及mas()函数的高级用法

    max(iterable, *[, key, default]) max(arg1, arg2, *args[, key]) 函数功能为取传入的多个参数中的最大值,或者传入的可迭代对象元素中的最大值.默认数值型参数,取值大者:字符型参数,取字母表排序靠后者.还可以传入命名参数key,其为一个函数,用来指定取最大值的方法.default命名参数用来指定最大值不存在时返回的默认值. eg a.传入的多个参数的最大值 print(max(1,2,3,4)) 输出 b.1 传入可迭代对象时,取其元素最大

  • python 函数中的内置函数及用法详解

    今天来介绍一下Python解释器包含的一系列的内置函数,下面表格按字母顺序列出了内置函数: 下面就一一介绍一下内置函数的用法: 1.abs() 返回一个数值的绝对值,可以是整数或浮点数等. print(abs(-18)) print(abs(0.15)) result: 18 0.15 2.all(iterable) 如果iterable的所有元素不为0.''.False或者iterable为空,all(iterable)返回True,否则返回False. print(all(['a','b',

  • Swift的74个常用内置函数介绍

    Swift包含了74个内置函数,但在 The Swift Programming Langage 一书中只介绍了其中的7个,其它的都没有在文档中体现. 这篇文章列举出了所有的Swift库函数.文中所谓的 内置函数 是指无需引入任何模块(比如说Fundation等)即可以直接使用的函数. 下面先来看看7个在文档中提到的库函数: 下面列出一些很实用,但未在文档中体现的库函数: 复制代码 代码如下: //断言,参数如果为`true`则继续,否则抛出异常 //assert mentioned on pa

  • python内置函数:lambda、map、filter简单介绍

    lambda lambda可以理解为一种小函数,但是它是一个表达式,而不是一个语句,所以在def不允许出现的地方仍然可以使用lambda函数,例如list里.但是lambda内只可以执行一个表达式. def f(x): return x**2 print f(3) a = lambda x: x**2 print a(3) a = lambda x,y: x+y print a(1,2) ~ 一个lambda语句就相当于一个函数定义,调用的时候也和函数一样. map函数 有时候我们可以需要处理一

  • python中68个内置函数的总结与介绍

    python内置函数 内置函数就是python给你提供的, 拿来直接用的函数, 比如print., input等. 截止到python版本3.6.2 python一共提供了68个内置函数. 68个内置函数 abs()          dict()      help()        min()        setattr() all()          dir()        hex()        next()      slice()  any()          divmod

  • 几个实用的PHP内置函数使用指南

    PHP有许多内置函数,其中大多数函数都被程序员广泛使用.但也有一些函数隐藏在角落,本文将向大家介绍7个鲜为人知,但用处非常大的函数. 没用过的程序员不妨过来看看. 1.highlight_string() 当需要在一个网站中展示PHP代码时,highlight_string()函数就变的非常有用了.该函数通过使用PHP语法高亮程序中定义的颜色,输出或返回给定的PHP代码的语法高亮版本. 示例: 复制代码 代码如下: <?php highlight_string('<?php phpinfo()

随机推荐