相关疑难解决方法(0)

JVM如何决定JIT编译方法(将方法归类为"热门")?

我已经使用过-XX:+PrintCompilation,我知道JIT编译器的基本技术以及使用JIT编译的原因.

然而,我仍然没有发现JVM如何决定JIT编译方法,即"正确的时间来到JIT编译方法".

我是否正确地假设每个方法都开始被解释,并且只要它不被归类为"热方法"它就不会被编译?我有一些东西在脑后,我读到一个方法被认为是"热",当它执行至少10.000次(解释方法10.000次后,它将被编译),但我不得不承认我是不确定这个或我在哪里读到这个.

总结一下我的问题:

(1)只要没有将每种方法归类为"热"方法(并因此已被编译),或者即使它们不是"热门",也有理由编制方法?

(2)JVM如何将方法分为"非热"和"热"方法?执行次数?还要别的吗?

(3)如果"热"方法存在某些阈值(如执行次数),是否有Java标志(-XX:...)来设置此阈值?

java jit jvm jvm-hotspot

30
推荐指数
2
解决办法
5887
查看次数

了解-XX:+ PrintCompilation的输出

我在Java列表迭代代码上运行一些微基准测试.我使用了-XX:+ PrintCompilation和-verbose:gc标志来确保在运行定时时后台没有发生任何事情.但是,我在输出中看到了一些我无法理解的东西.

这是代码,我正在运行基准测试:

import java.util.ArrayList;
import java.util.List;

public class PerformantIteration {

    private static int theSum = 0;

    public static void main(String[] args) {
        System.out.println("Starting microbenchmark on iterating over collections with a call to size() in each iteration");
        List<Integer> nums = new ArrayList<Integer>();
        for(int i=0; i<50000; i++) {
            nums.add(i);
        }

        System.out.println("Warming up ...");
        //warmup... make sure all JIT comliling is done before the actual benchmarking starts
        for(int i=0; i<10; i++) {
            iterateWithConstantSize(nums);
            iterateWithDynamicSize(nums);
        }

        //actual        
        System.out.println("Starting the actual test");
        long constantSizeBenchmark …
Run Code Online (Sandbox Code Playgroud)

java microbenchmark

19
推荐指数
1
解决办法
9091
查看次数

关于分段代码缓存的小问题(http://openjdk.java.net/jeps/197)

我看到这个 JEP ( http://openjdk.java.net/jeps/197 ) 引入了 3 种类型的代码缓存。

对我来说最明显的一个是-XX:NonNMethodCodeHeapSize。这是处理 JVM 内部数据的一个。

NonProfiledCodeHeapSize我不明白和之间有什么区别ProfiledCodeHeapSize。该文件说:

分层编译还引入了一种新的编译代码类型:插装编译代码(分析代码)。

我的理解是,这里的“仪表化”意味着“带有计数器”,那么假设这真的是C1编译代码的逻辑是什么?另一个是C2

java jit jvm java-11 java-16

3
推荐指数
1
解决办法
201
查看次数

标签 统计

java ×3

jit ×2

jvm ×2

java-11 ×1

java-16 ×1

jvm-hotspot ×1

microbenchmark ×1