Tag: jit

是否有可能使java.lang.invoke.MethodHandle与直接调用一样快?

我正在比较MethodHandle::invoke和直接静态方法MethodHandle::invoke性能。 这是静态方法: public class IntSum { public static int sum(int a, int b){ return a + b; } } 这是我的基准: @State(Scope.Benchmark) public class MyBenchmark { public int first; public int second; public final MethodHandle mhh; @Benchmark @OutputTimeUnit(TimeUnit.NANOSECONDS) @BenchmarkMode(Mode.AverageTime) public int directMethodCall() { return IntSum.sum(first, second); } @Benchmark @OutputTimeUnit(TimeUnit.NANOSECONDS) @BenchmarkMode(Mode.AverageTime) public int finalMethodHandle() throws Throwable { […]

Java和.Net之间的JIT有什么不同

我知道Microsoft .NET使用CLR作为JIT编译器,而Java具有Hotspot。 它们之间有什么区别?

玩框架。 无需编译

我被介绍到Play框架,我发现它的一个惊人的事情是没有必要编译项目。 您只需保存已编辑的文件并重新加载网页即可。 我被告知Java源代码被编译为字节码然后用JIT编译器编译,那么Play框架内部的魔力是什么?

我们可以在硬件中实现一个java解释器本地执行Java字节码吗?

如果我们在硬件中实现java解释器那么我们如何实现java字节码的架构中立性… java是否使用JIT(只是在时间解释器中)? 以及这些与虚拟机概念的操作系统和java虚拟机(JVM)有何关系

validation,方法执行和JIT编译过程中类加载的原因和跟踪

我试图在非常详细的基础上理解哪些事件导致类加载,并且在我的测试期间遇到了一个我在这个非常基本的示例中无法理解的行为: public class ClinitTest { public static Integer num; public static Long NUMTEST; static { NUMTEST = new Long(15);; num = (int) (NUMTEST * 5); System.out.println(num); } public static void main(String[] args) { System.out.println( “The number is ” + num); } } 在执行时运行java.lang.Long时。 好吧,它先前由bootstrap类加载器加载,但此时调用了AppClassloader,因为它尚未注册为启动类加载器。 因此,LauncherHelper将获取应用程序类,在它调用main方法之前,JVM将确保该类已初始化。 在执行期间,会发生此类加载。 在另一个运行中,我使用Java代理将重命名为其他内容并添加一个空代理。 我的期望是 – 由于原来的代码没有被执行,我也不会得到类加载事件。 奇怪的是,此时java.lang.Long的负载似乎发生在更早的时间。 在我的跟踪中,我看到当LauncherHelper尝试validation主类时会触发它。 在这里,它尝试通过reflection获取main方法,并且在引擎盖下调用java.lang.Class.getDeclaredMethods0()会导致调用AppClassLoader请求java.lang.Long 。 所以问题是: […]

Java 8 JIT线程似乎陷入无限循环

我用Java 8编写了一个服务器应用程序,并用java 1.8.0u25运行它。 它在前几个小时工作正常,但在获得大约5k~10k请求后,VM进程的一个线程使用其中一个CPU的100%。 所以我尝试使用jstack for VM进程检查有问题的线程是什么,并且它显示线程(线程id为14303 = 0x37df)是“C2 CompilerThread0”: “C2 CompilerThread0” #6 daemon prio=9 os_prio=0 tid=0x00002aaabc12a000 nid=0x37df runnable [0x0000000000000000] java.lang.Thread.State: RUNNABLE 使用jstack -m ,线程的堆栈跟踪如下: —————– 14303 —————– 0x00002b99b67693c3 _ZN16PhaseMacroExpand27process_users_of_allocationEP8CallNode + 0x2a3 0x00002b99b676ec3b _ZN16PhaseMacroExpand23eliminate_allocate_nodeEP12AllocateNode + 0x1cb 0x00002b99b676ee65 _ZN16PhaseMacroExpand21eliminate_macro_nodesEv + 0x1a5 0x00002b99b6772769 _ZN16PhaseMacroExpand18expand_macro_nodesEv + 0x19 0x00002b99b640b01b _ZN7Compile8OptimizeEv + 0xa6b 0x00002b99b640c53c _ZN7CompileC1EP5ciEnvP10C2CompilerP8ciMethodibbb + 0x13bc 0x00002b99b635f9c8 _ZN10C2Compiler14compile_methodEP5ciEnvP8ciMethodi + […]

为什么这个内循环在通过外循环的第一次迭代中加快了4倍?

我试图重现这里描述的一些处理器缓存效果。 我知道Java是一个托管环境,这些例子不会完全翻译,但我遇到了一个奇怪的案例,我试图提炼出一个简单的例子来说明效果: public static void main(String[] args) { final int runs = 10; final int steps = 1024 * 1024 * 1024; for (int run = 0; run < runs; run++) { final int[] a = new int[1]; long start = System.nanoTime(); for (int i = 0; i < steps; i++) { a[0]++; } long […]

拥有许多小方法是否有助于JIT编译器进行优化?

在最近关于如何优化某些代码的讨论中,我被告知将代码分解为许多小方法可以显着提高性能,因为JIT编译器不喜欢优化大型方法。 我不确定这一点,因为看起来JIT编译器本身应该能够识别自包含的代码段,而不管它们是否在自己的方法中。 任何人都可以确认或反驳这种说法吗?

我可以强制JVM本地编译给定的方法吗?

当我的应用程序启动时,我经常调用一个性能关键的方法。 最终,它被JIT编译,但是在解释器中运行了一些明显的时间之后。 有没有什么办法可以告诉JVM我想从一开始就编译这个方法(没有用-XX:CompileThreshold类的东西调整其他内部-XX:CompileThreshold )?

性能说明:预热后代码运行速度较慢

下面的代码运行完全相同的计算3次(它没有做太多:基本上添加从1到100米的所有数字)。 前两个块的运行速度比第三个块快约10倍。 我已经运行了这个测试程序超过10次,结果显示非常小的差异。 如果有的话,我希望第三个块运行得更快(JIT编译),但典型的输出是: 35974537 36368455 296471550 有人能解释一下发生了什么吗? (为了清楚起见,我不是要在这里修改任何东西,只是想更好地了解发生了什么) 注意: 程序期间没有运行GC(使用-XX:+PrintGC ) 使用Oracle JDK版本1.6.0_30,1.7.0_02和1.7.0_05进行测试 还使用以下参数进行测试: -XX:+PrintGC -Xms1000m -Xmx1000m -XX:NewSize=900m =>相同结果 它将块放入循环中,所有运行都很快 如果将块提取到方法,则所有运行都很快(无论方法被调用3次还是循环都没有区别) public static void main(String… args) { //three identical blocks { long start = System.nanoTime(); CountByOne c = new CountByOne(); int sum = 0; for (int i = 0; i < 100000000; i++) { […]