Java 为什么这些方法要编译成汇编?

Java 为什么这些方法要编译成汇编?,java,java-8,jvm,Java,Java 8,Jvm,我的Java版本: java -XX:+PrintCompilation Inline 10000 我错过什么了吗 据我所知,您在评论中链接到的信息已过时。这篇文章的日期是2013年,描述了当时可用的Java版本 如果您查看Java8和Java9OpenJDK源代码,就会发现本文中描述的计数器衰减代码已经不存在了。这就解释了为什么在Java8中看不到这种效果 (要查看的地方是源代码树中的“/jdk8u/hotspot/src/share/vm/runtime/safepoint.cpp”。请

我的Java版本:

java -XX:+PrintCompilation Inline 10000 

我错过什么了吗

据我所知,您在评论中链接到的信息已过时。这篇文章的日期是2013年,描述了当时可用的Java版本

如果您查看Java8和Java9OpenJDK源代码,就会发现本文中描述的计数器衰减代码已经不存在了。这就解释了为什么在Java8中看不到这种效果


(要查看的地方是源代码树中的“/jdk8u/hotspot/src/share/vm/runtime/safepoint.cpp”。

请解释“safepoints和计数器衰减的影响”是什么意思,以及为什么您认为“Thread.sleep()应该插入一个safepoint,而不应该编译这些方法。”。提供一些背景信息的参考链接可能会有所帮助……您正在阅读的文章是关于即时编译器的,它不同于运行
javac
,因此“此代码不编译”语句不是真正的计算机(处理器)无法执行任何代码-它只能执行汇编。您将Java代码编译成Java字节码,以便Java虚拟机执行,然后Java虚拟机将Java字节码内部编译成程序集。看一看Oracle Java教程中的Java简介:您参考的文章来自2013年,Hotspot实现自那时起可能已经发生了变化,这一点不应让您感到惊讶。。。我看了。我在哪里可以在线查看OpenJDK的源代码?我正在查看并试图找到您提到的路径,但我似乎找不到:)我安装了mercurial并将OpenJDK树提取到我的硬盘上。如果您有本地副本,则搜索(查找,grep)更容易。
java -XX:+PrintCompilation Inline 10000 
java version "1.8.0_144"
Java(TM) SE Runtime Environment (build 1.8.0_144-b01)
Java HotSpot(TM) 64-Bit Server VM (build 25.144-b01, mixed mode)