JAVA JIT编译

分别使用lambda表达式以及普通for循环做测试
默认情况下启用JIT

package com.gao.demo;import java.util.ArrayList;
import java.util.List;public class Demo {public static void main(String[] args) {List<Integer> list = new ArrayList<>();for (int i = 0; i < 100000; i++) {list.add((int) Math.random() * 100);}for (int i = 0; i <10 ; i++) {System.out.println(i+" "+getTime(list));}}public static long getTime(List<Integer> list) {long start = System.currentTimeMillis();list.forEach(i -> {int tmp = i;});//        for (int i:list) {//            int tmp=i;
//        }return System.currentTimeMillis()-start;}}

1、启用JIT以及Lambda

0 30
1 2
2 0
3 0
4 0
5 1
6 0
7 0
8 0
9 0

2、启用JIT以及普通for循环

0 6
1 1
2 0
3 0
4 0
5 0
6 1
7 0
8 0
9 0

使用lambda在首次加载的过程中耗费时间过久的原因:
显然,您遇到了lambda表达式的首次初始化开销。正如注释中已经提到的,lambda表达式的类是在运行时生成的,而不是从类路径加载的。然而,生成类并不是速度变慢的原因。毕竟,生成一个结构简单的类比从外部源加载相同的字节还要快。内部类也必须加载。但是,当应用程序以前没有使用lambda表达式时,甚至必须加载用于生成lambda类的框架(Oracle当前的实现在幕后使用ASM)。这是导致十几个内部使用的类(而不是lambda表达式本身)减速、加载和初始化的真正原因。
总结:
Lambda表达式在应用程序中首次使用时,需要额外加载ASM框架,因此需要更多的编译,加载的时间
Lambda表达式的底层实现并非匿名内部类的语法糖,而是其优化版

关闭JIT方法:
java -Xint your_main_class_file_name
java -Djava.compiler=NONE your_main_class_file_name
3、关闭JIT以及使用Lambda

0 33
1 5
2 7
3 5
4 6
5 5
6 5
7 6
8 5
9 5

4、关闭JIT以及使用普通for循环

0 10
1 13
2 13
3 12
4 11
5 11
6 12
7 11
8 15
9 10

JAVA JIT编译相关推荐

  1. JAVA JIT编译简介与C2编译器bug记录

    每天多学一点点~ 话不多说,这就开始吧- 文章目录 1.前文 2.C1编译器 3.C2编译器 4.分层编译 5.热点代码和热点探测(JIT) 6.C2编译器bug演示 7.结语 1.前文 最近看了些关 ...

  2. 【Java】实战Java虚拟机之五“开启JIT编译”

    今天开始实战Java虚拟机之五"开启JIT编译" 总计有5个系列 实战Java虚拟机之一"堆溢出处理" 实战Java虚拟机之二"虚拟机的工作模式&qu ...

  3. java全jit编译_JVM即时编译(JIT)(转载)

    原文出处:https://blog.csdn.net/sunxianghuang/article/details/52094859 什么是JIT 1.动态编译(dynamic compilation) ...

  4. 关于 .NET 与 JAVA 在 JIT 编译上的一些差异

    最近因为公司的一些原因,我也开始学习一些 JAVA 的知识.虽然我一直是以 .NET 语言为主的程序员,但是我并不排斥任何其它语言.在此并不讨论 JAVA .NET 的好坏,仅仅是对 .NET 跟 J ...

  5. java 及时编译_Java 面试-即时编译( JIT )

    当我们在写代码时,一个方法内部的行数自然是越少越好,这样逻辑清晰.方便阅读,其实好处远不止如此,通过即时编译,甚至可以提高执行时的性能,今天就让我们好好来了解一下其中的原理. 简介 当 JVM 的初始 ...

  6. 执行引擎的工作过程、Java代码编译和执行的过程、解释器、JIT编译器

    执行引擎概述 执行引擎是Java虛拟机核心的组成部分之一. "虚拟机"是-一个相对于"物理机"的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接 ...

  7. java全jit编译_Javac编译与JIT编译

    词法分析是将源代码的字符流转变为标记(Token)集合.单个字符是程序编写过程中的的最小元素,而标记则是编译过程的最小元素,关键字.变量名.字面量.运算符等都可以成为标记,比如整型标志int由三个字符 ...

  8. 【深入Java虚拟机】之七:Javac编译与JIT编译

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/18009455 编译过程 不论是物理机还是虚拟机,大部分的程序代码从开始编译到最终转化成物理 ...

  9. 你的Java代码对JIT编译友好么?

    JIT编译器是Java虚拟机(以下简称JVM)中效率最高并且最重要的组成部分之一.但是很多的程序并没有充分利用JIT的高性能优化能力,很多开发者甚至也并不清楚他们的程序有效利用JIT的程度. 在本文中 ...

最新文章

  1. 允许使用抽象类类型 isearchboxinfo 的对象_final关键字、抽象类以及接口
  2. php中正则表达式用法,php与js中的正则表达式用法
  3. Promise解决异步操作问题
  4. asp.net(c#) 将dbf转换为xls或wps,并将数据的列名改成中文;并判断本机是否安装office2003,2007和wps2007,2010...
  5. MySQL对一行多列求和
  6. ACCESS中不支持left join解决方案
  7. c语言printf里的自增,笔试题记录:C语言——函数printf()的执行机制;先自增与后自增的区别;取值运算与自增运算的优先级...
  8. java sql2008的增删改查_SQL server数据库增删改查练习
  9. 移植SlidingMenu Android library,和安装example出现的问题解决
  10. nginx的源代码分析--间接回调机制的使用和类比
  11. 如何更改springboot的tomcat版本
  12. 管理定律——管理学中常见的定律集合
  13. 字节跳动内推码 春招 社招
  14. 证券交易金融知识学习(1)
  15. 左右值无限分类实现算法
  16. 秋招选择题(二)图形推理题
  17. Unity 3d网游画面的3d效果
  18. 《操作系统》期末考试试卷2
  19. 2018 蓝桥杯省赛 B 组模拟赛(一)G. 数列求值(第一次见这种递推.)
  20. C语言编程练习,扫雷游戏

热门文章

  1. Python写一个账号密码小助手(包含增删改查功能)
  2. 获取中英文字符串长度
  3. cordova调用java_Cordova入门系列(三)Cordova插件调用
  4. 王小波《沉默的大多数》
  5. java比poi好用的工具五金零配件_好用不一定很贵---平价实用工具介绍
  6. 三人行均为我师^_^
  7. OLED显示屏 IIC/I²C/I2C通信 128*64分辨率 SH1106 / SSD1306 驱动教程
  8. 无限吃巧克力:图证64=65?
  9. Python 绘制全球 2019-nCoV 地图
  10. 国内大神成功给手机装上了 Win11,代码已开源!