有可用的标志提供有关已编译方法的日志信息。关于未编译的方法的信息在哪里以及为什么它们没有被编译?能够看到热点编译器如何做出决策以及它没有编译某些方法的原因可以让我更好地理解JVM,并允许我编写更好的代码并可能优化我的一些方法。有人对这个问题有什么看法吗?
答案 0 :(得分:2)
根据:http://blog.headius.com/2009/01/my-favorite-hotspot-jvm-flags.html
-XX:+ PrintCompilation 打印出每个Java方法Hotspot的名称 决定JIT编译。清单会 通常会显示一堆核心Java 最初的类方法,然后转 到您的应用程序中的方法。
我个人认为,这只会耗费你很多时间。如果您使用最佳实践和一些常识进行编码,那么如果性能是一个问题,请进行配置文件。你应该做得很好。
答案 1 :(得分:1)
答案是如果方法没有被执行足够多次,则可能无法编译方法。本机代码缓存是有限的,因此编译每个方法都会适得其反;你可能最终得到了许多已编译的方法,但重要的方法不再适合缓存大小。
确切的数字因版本而异,但如果您使用MODULE method
IMPLICIT NONE
REAL, DIMENSION(:,:), ALLOCATABLE :: C ! declared here to be used...
REAL, DIMENSION(:,:), ALLOCATABLE :: a1end ! ...by procedures outside this module
:
CONTAINS
SUBROUTINE method_init(A,a1end,C)
IMPLICIT NONE
REAL, DIMENSION(:,:), ALLOCATABLE, INTENT(IN) :: A ! deferred shape (it's allocated elsewhere in the main program)j
REAL, DIMENSION(:,:), ALLOCATABLE, INTENT(OUT) :: C ! declared here to be used...
REAL, DIMENSION(:,:), ALLOCATABLE, INTENT(OUT) :: a1end ! ...as input/output variables
:
ALLOCATE(C( ),a1end( ))
:
END SUBROUTINE method_init
END MODULE method
运行Java,那么您将看到可以调整的所有设置,包括count = collections.defaultdict(int) # => default value is 0
...
count[event] += 1 # will end to 1 on first hit and will increment later
(其值为2000) -XX:+PrintFlagsFinal
(其值为15000)。因此,如果你没有超过2000次调用你的方法,它只需要使用解释器来完成它。
如果您想在JIT条件下执行分析,那么您需要执行大量调用方法的循环以查看好处,或者使用分析工具(如JMH)进行分析正常。