【发布时间】:2018-10-24 20:33:29
【问题描述】:
JVM 何时将字节码转换为机器码? 1. 类加载时每个类只有一次? 2.在创建类的每个对象时,例如Student类中的Student对象? 3. 还是在每次方法调用期间?
这将如何在方法调用期间与方法堆栈同步。
【问题讨论】:
-
回复。第一个问题:我认为这取决于命令行选项和JVM。我很确定从历史上看,命令行上的
-server开关会导致所有字节码在任何执行之前都被编译。但是我相信现在所有 64 位 JVM 都会预编译字节码,无论它们是否作为服务器运行。 -
此页面可能是相关的,尽管其中一些信息似乎很旧。 stackoverflow.com/questions/198577/…
-
在这个页面上它说 64 位 JVM 隐含了
-server选项:docs.oracle.com/javase/10/tools/java.htm -
@markspace 正确,从来没有“客户端”64 位 JVM(如果是 HotSpot)。但是无论如何,客户端和服务器 JVM 之间的区别已经被“分层编译”所取代。简单来说,JVM还是以解释模式启动,但是会用tier1编译器(相当于client)快速编译常用的方法,但是用tier2编译器(相当于server)花更多的时间在最热点的profiling和优化上。