4.1 JIT概览

  语言根据执行的方式不同分为编译型语言和解释型语言。以C++为代表的编译型语言在执行前需要编译成机器码,不同的CPU需要不同的编译器,编译成功后在同一台机器不需再次编译。以Python为代表的解释型语言,解释器一行一行的解释执行Python代码。

  编译型语言的优势在于跨平台,只要平台能够提供相应的解释器都可以执行Python代码。其缺点在于效率,比如对于循环,每次循环都要重新解释执行,而对于编译型代码在循环开始前编译一次无需再次编译。

编译器的优化

  编译器在编译语言的时候需要一定优化,优化的结果是编写的代码和机器码是不同的。优化的目的是更好的利用CPU,降低CPU等待时间。优化的副作用是会在并发编程中带来可见问题。编译器一个重要优化是从内存里取变量优化成从CPU缓存或寄存器里取变量(volatile的味道)。

  

  按理来说sum的值应该在内存里,然后每次计算的时候从内存读到寄存器,然后累加完成写回去。但如果编译器在一开始把sum放到寄存器里,累加完成后写回内存,这样和内存交互只有一次。当然,这种编译器的优化带来的是并发编程的无尽问题。

Java是怎么搞的

  Java走的是中间路线。javac把java代码编译成字节码,虚拟机解释执行字节码,并在解释执行的过程中把热点代码编译成汇编语言。由于编译的过程是在运行字节码过程中,所以被称为JIT,just in time,即使编译。

为什么不直接编译呢?

  • 如果一段代码只执行一次,编译的时间会大于解释执行的时间,所以只有那些反复执行的代码才有编译的必要,这些反复执行的代码被称为HotSpot。也只有在代码文件执行一定次数后,才能发现哪些代码是hotspot,这也是Java不直接编译的原因。
  • 一段代码执行的次数越多,编译的时候优化的结果就越好。比如java编译成class文件的时候是没有连接这一步的,所有的引用都是符号引用,需要在运行的时候判断真正引用地址。在多次执行代码的过程中能够发现一个符号引用总是指向某一物理地址,那么就可以在编译的时候直接把符号引用编译成物理地址,无需在运行的时候动态确定。

4.2 Client Server选择

  JVM启动参数,区别在于执行class文件时编译的时机不同。

  • client编译代码更早,编译器的优化更少,所以编译的类更多、质量更差。
  • server编译代码晚,编译后的代码“质量”更高,运行更快。

  为什么要这样?

  • 客户端程序生存周期短,需要加载的类较少,代码较为简单,更适合解释执行。而Server端程序复杂,运行时间更久,所以更晚质量更高的编译收获更大。
  • 客户端对启动时间更敏感。

 分层编译

  把server client统一起来的一种编译技术,在程序刚刚启动的时候使用client编译,等到程序热起来再切换成server。java8中默认开启分层编译。

4.4 与编译有关的虚拟机参数

  编译器缓存

  编译好的代码需要在JVM里缓存起来,当缓存被填满的时候就无法继续编译后续的热点代码。需要根据业务合理的提高该值。

  • -XX:ReservedCodeCacheSize 缓存最大值
  • -XX:initialCodeCacheSize 缓存初始值

  缓存从初始值开始分配符,最大分配到最大值。

  值得注意的是分层编译缓存很容易超出上限,尤其在Java7。

第4章 JIT编译器的更多相关文章

  1. JIT编译器

    深入理解Java Class文件格式(九) http://blog.csdn.net/zhangjg_blog/article/details/22432599 http://blog.csdn.ne ...

  2. 《Java性能权威指南》笔记----JIT编译器

    概览 编译型语言(C++,Fortran等):运行程序前,需要用编译器将代码静态编译成CPU可执行的汇编码.汇编码针对特定的CPU. 优点:只需编译一次,且有足够的程序信息来优化汇编码.执行速度快: ...

  3. 谈谈JIT编译器和本机影像生成器(NGen.exe)

    前言 在看<CLR>的时候,作者在开篇的时候提到了NGen.exe,前面一节执行程序集的代码中提到:程序或方法执行前会执行MSCorEE.dll中的JIT函数把要执行方法的IL转换成本地的 ...

  4. 浅谈对JIT编译器的理解。

    1. 什么是Just In Time编译器? Hot Spot 编译 当 JVM 执行代码时,它并不立即开始编译代码.这主要有两个原因: 首先,如果这段代码本身在将来只会被执行一次,那么从本质上看,编 ...

  5. NET基础课--JIT编译器如何工作1

    1..Net运行时调用JIT编译器,用来把由C#编译器生成的IL指令编译成机器代码.这一任务在应用程序的运行期间是分步进行的.JIT并不是在程序一开始就编译整个应用程序,取而代之的是,CLR是一个函数 ...

  6. JIT编译器技术理解

    参考链接: https://blog.csdn.net/liaodehong/article/details/51605457 https://www.cnblogs.com/insistence/p ...

  7. 五、CLR加载程序集代码时,JIT编译器对性能的产生的影响

    1.CLR首次加载代码造成的性能损失 四.CLR执行程序集中代码介绍了CLR在首次执行一个类的时,会初始化一个内部结构,然后当目标方法被首次调用时,JITComplier函数(JIT编译器)会验证IL ...

  8. 第一章-Javac编译器介绍

    1.Javac概述 编译器可以将编程语言的代码转换为其他形式,如Javac,将Java语言转换为虚拟机能够识别的.class文件形式.而这种将java源代码(以.java做为文件存储格式)转换为cla ...

  9. 深入浅出 JIT 编译器

    转载 https://www.ibm.com/developerworks/cn/java/j-lo-just-in-time/ JIT 编译器在运行程序时有两种编译模式可以选择,并且其会在运行时决定 ...

随机推荐

  1. vbs msgbox提示信息最前面显示

    msgbox strContent, vbOKOnly or vbExclamation or vbSystemModal,strTitle 提示框类型列表: 常数 值 描述 vbOKOnly 0 只 ...

  2. (二)SpringMVC+mybatis实践

    一.需求 以案例作为驱动 springmvc和mybatis使用一个案例(商品订单管理系统) 功能需求:商品的列表查询 二.环境准备 数据库环境 Java环境 jdk1.8 eclipse sprin ...

  3. mongodb的开机自启动

    一.背景 Linux轻松的在rc.local中写上启动脚本,reboot~发现没有启动成功.这不科学啊,查看日志发现“permission denied” 二.解决 Linux系统下,使用自定配置文件 ...

  4. python清理docker-harbor的多余镜像

    # coding: utf-8 from operator import itemgetter from urllib import parse import requests import date ...

  5. postgre查询表和记录数,查表字段

    select relname as TABLE_NAME, reltuples as rowCounts from pg_class where relkind = 'r' and relnamesp ...

  6. TypeScript泛型类 - 把类作为参数类型的泛型类

    /* TypeScript泛型类 - 把类作为参数类型的泛型类 */ /* 泛类:泛型可以帮助我们避免重复的代码以及对不特定数据类型的支持(类型校验),下面我们看看把类当做参数的泛型类 1.定义个类 ...

  7. centos6.8安装python3.7.3报错Can't connect to HTTPS URL because the SSL module is not available问题解决

    环境:CentOS release 6.8 (Final) # 直接编译python3.7在使用pip3安装依赖的时候报错: Can't connect to HTTPS URL because th ...

  8. Git 代码撤销、回滚到任意版本(当误提代码到本地或master分支时)

    转自https://www.cnblogs.com/lwh-note/p/9639835.html 两种情况(场景) 情况一      代码还只在本地,未push到运程仓库,想把代码还原到上一次com ...

  9. RestSHarp

    异步扩展: public static class RestClientExtensions { private static Task<T> SelectAsync<T>(t ...

  10. linux安装Erlang

    Erlang一种通用的面向并发的编程语言. 1.安装Erlang编译依赖: yum -y install gcc glibc-devel make ncurses-devel openssl-deve ...