Java中的本地实现是什么?
这个问题在这里已经有了答案:
这些方法或者是内部的,或者是在“本机”代码之外编写的,也就是说,特定于给定的机器。
您提到的是Intrinsic和JDK的一部分,但您也可以使用Java Native Interface(JNI)自己编写本机方法。 这通常使用C来编写方法,但是很多其他语言(如python)允许您以相当简单的方式编写方法。 代码是以这种方式编写的,无论是为了性能,还是因为它需要访问平台特定的基础结构,而这些基础结构不能用普通的java来完成。
在hashcode()
的情况下,这由JVM实现。 这是因为散列码通常只与JVM知道的东西有关。 在早期的JVM上,这与对象在内存中的位置有关 - 在其他JVM上,对象可能在内存中移动,因此可能会使用更复杂(但仍然非常快)的方案。
其他答案中提到的大多数本地方法都是使用JNI实现的。
但是,诸如Object.hashCode
类的性能关键方法通常作为内在函数实现。 当字节代码被编译为机器代码时,Java编译器会识别方法调用并直接对适当的代码进行内联。 这显然比通过JNI处理一个简单的方法要快得多。
很多人会声称Object.hashCode
会返回内存中对象表示的地址。 在现代实现中,对象实际上在内存中移动 相反,对象头部的一个区域用于存储该值,该值可能是在第一次请求该值时从内存地址延迟派生的。
本地方法主要以C语言实现,并编译为直接在机器上运行的本地代码。 这与普通方法相反,普通方法在Java中实现并编译为由Java虚拟机(JVM)执行的Java字节代码。
要从Java接口到这些方法,您需要使用Java本地接口(JNI)。
本机代码主要用于访问低级别的东西。 在hashCode的情况下,这是内存中对象的地址。 我对克隆的猜测是,它将原始内存从给定对象复制到克隆的对象。 本地代码的其他用途是访问操作系统功能或硬件。
使用本机代码的缺点是您失去了JVM的安全性,即您的程序可能会因本机代码中的错误而崩溃或出现安全漏洞。
链接地址: http://www.djcxy.com/p/92125.html