我已经读了很多关于JIT和JVM的文章,我正在试图找出一些东西,我希望有人能帮助我。
当我们编写包含外部JAR的java程序时,例如:包含: ExternalJar.jar:
ClassA.class
ClassB.class
ClassC.class问题:
ClassA和ClassC也会因为它们在同一个JAR中而被编译吗?
System.class是否也被编译成机器代码(无论是在运行时启动时还是在运行时实际调用该方法),还是这些类是否存在某种已经缓存的机器代码?
谢谢
发布于 2014-12-08 14:16:24
如果JAR从未被使用过: JIT是否仍将JAR中包含的类编译为初始化阶段(运行应用程序的JVM的第一阶段)中的机器代码?或者像DLL一样,只有当我们实际上从JAR中的一个类调用一个方法时,JAR才会在运行时加载?
答: JAR只在运行时加载,即使JAR中的类也是第一次在引用中加载类。方法编译通常是基于热点原理进行的。
如果1的答案是当我们实际上从JAR中的一个类调用一个方法时:那么使用JIT的好处是什么呢?JIT应该通过在应用程序启动阶段执行繁重的工作来改善运行时。
注释:JIT通常编译大量使用的方法。这种大量使用是根据运行时信息确定的。JIT剂量可缩短启动时间。
JIT是否必须编译JAR中的所有类,例如,如果我们使用:
答:不
ClassB.MethodB();ClassA和ClassC也会被编译,因为它们在同一个JAR中吗?
无
包含基本java框架类的rt.jar怎么办?例如,如果我调用:
System.out.println("");是否也会将System.class编译为机器代码(无论是在运行时启动时还是在运行时实际调用该方法),还是这些类是否存在某种已经缓存的机器代码?
答:不,JIT只编译使用频繁的方法。它并不是在同一个类中编译所有其他方法。
https://stackoverflow.com/questions/27344989
复制相似问题