Hotspot JVM 中方法未编译的原因

问题描述 投票:0回答:2

有可用的标志提供已编译方法的日志信息。 有关未编译的方法以及未编译的原因的信息在哪里? 能够了解热点编译器如何做出决定以及它不编译某些方法的原因将使我更好地了解 JVM,并允许我编写更好的代码并可能优化我的一些方法。 大家对这个话题有什么想法吗?

java jit jvm-hotspot
2个回答
3
投票

根据:http://blog.headius.com/2009/01/my-favorite-hotspot-jvm-flags.html

-XX:+PrintCompilation 打印出每个Java方法Hotspot的名称 决定进行 JIT 编译。该名单将 通常会展示一堆核心Java 首先类方法,然后依次类方法 到您的应用程序中的方法。

我个人认为这只会浪费你很多时间。 如果您使用最佳实践和一些常识进行编码,然后如果性能是一个问题,请进行分析。你应该做得很好。


1
投票

答案是,如果方法执行次数不够,则可能无法编译。本机代码缓存是有限的,因此编译每个方法会适得其反;您最终可能会得到许多已编译的方法,但重要的方法不再适合缓存大小。

确切的数字因版本而异,但如果您使用

-XX:+PrintFlagsFinal
运行 Java,那么您将看到可以调整的所有设置,包括
Tier3CompileThreshold
(其值为 2000)
Tier4CompileThreshold
(其具有值 15000)。因此,如果您调用方法的次数不超过 2000 次,它将仅使用解释器来执行它。

如果您想在 JIT 条件下执行分析,那么您需要执行大量循环调用方法才能看到好处,或者使用分析工具(例如 JMH)来正确执行分析。

© www.soinside.com 2019 - 2024. All rights reserved.