2016
Apr
05

Java Virtual Machine 在执行一段时间后,它的 Preformance 会变得越来越好,原因是 JVM 必须先暖机,但是为什么要先暖机呢,一开始就先暖好不行吗?

Java 的程式是必须先被编辑器 compile 成 bytecode,而 bytecode 只有 JVM 读得懂,所以也只能用 Java 来执>行,而Java 为了提升效能,使用了 JIT Compilter ,目的是将那些常常被执行的 methods , compile 成 Native Machine code,这样程式执行起来就为跟 C/C++ 一样快。

JVM 只针对整个 method 来做优化,并不会单独优化某一个程式区块

再来还有个问题必须了解,JVM 到底是如何定义哪些 method 为常常被执行呢? JVM 预设会将执行超过 1500 次的 method ,认定为必预优化的 method ,而将这些 method compile 成 Native Machine code。

1500 这个数字是可以改的,如果你觉得 1500 这个数字太大或太小,那么你可以用 -XX:CompileThreshold=xxx 来修改这个数值,例如下面这个 Java 执行语法。

java -XX:CompileThreshold=200 main

如果你写一段简单的 Java 程式来测试 java -XX:CompileThreshold=1 main java main 这两种 java 执行方式,你会发现第一种会花更多的时间,原因是我们强迫只要 method 第一次被执行,就立刻做优化,也因为优化的关系,所以比第二个指令要多花一点时间。

JIT Compilation

再来更深入了解 Java JIT 的运作方式,当某一个 Method 被执行后,JIT 就会记录这个 Method 被执行一次,直到它累积到 1500 次,这时 JIT 会对这个 method 进行第一次 compile,并将这个 method 的执行次数归零,在这个阶段,程式的执行效率就已经非常好了,但是当这个 method 再次的被执行了 1500 次之后, Java JIT 会对这个 method 做第二次的 compile,再次对 method 进化优化,使其效能更佳。


回應 (Leave a comment)