Java本身是一种面向对象的语言,最显著的特性有两个方面,一是所谓的“书写一次,到处运行”,能够非常容易地获得跨平台能力;
另外就是垃圾收集(GC),Java通过垃圾收集器(Garbage Collector)回收分配内存,大部分情况下,程序员不需要自己操心内存的分配和回收。
 
对于“Java是解释执行”这句话,说法不太准确。
我们开发的Java的源代码,首先通过Javac编译成为字节码(bytecode),然后,在运行时,通过Java虚拟机(JVM)内嵌的解释器将字节码解释执行,转换成为最终的机器码
但是常见的JVM,比如我们大多数情况使用的Oracle JDK提供的Hotspot JVM,都提供了JIT(Just-In-Time)编译器,也就是通常所说的动态编译器,JIT能够在运行时将热点代码编译成机器码,这种情况下部分热点代码就属于
编译执行,而不是解释执行了。
 
Javac的编译,编译Java源码生成“.class”文件里面实际是字节码,而不是可以直接执行的机器。
Java通过字节码和Java虚拟机(JVM)这种跨平台的抽象,屏蔽了操作系统和硬件的细节,这也是实现“一次编译,到处执行”的基础。
在运行时,JVM会通过类加载器(Class-Loader)加载字节码,解释或者编译执行
 
主流Java版本中,如JDK 8实际是解释和编译混合的一种模式,即所谓的混合模式(-Xmixed)。
通常运行在server模式的JVM,会进行上万次调用以收集足够的信息进行高效的编译,client模式这个门限是1500次。
Oracle Hotspot JVM内置了两个不同的JIT compiler,C1对应前面说的client模式,适用于对于启动速度敏感的应用,比如普通Java桌面应用;
C2对应server模式,它的优化是为长时间运行的服务器端应用设计的。
默认是采用所谓的分层编译(TieredCompilation)。
Java虚拟机启动时,可以指定不同的参数对运行模式进行选择。
比如,指定“-Xint”,就是告诉JVM只进行解释执行,不对代码进行编译,这种模式抛弃了JIT可能带来的性能优势。毕竟解释器(interpreter)是逐条读入,逐条解释运行的。
与其相对应的,还有一个“-Xcomp”参数,这是告诉JVM关闭解释器,不要进行解释执行,或者叫作最大优化级别。那你可能会问这种模式是不是最高效啊?简单说,还真未必。“-Xcomp”会导致JVM启动变慢非常多,同时有些
JIT编译器优化方式,比如分支预测,如果不进行profling,往往并不能进行有效优化。
 
除了我们日常最常见的Java使用模式,其实还有一种新的编译方式,即所谓的AOT(Ahead-of-Time Compilation),直接将字节码编译成机器代码,这样就避免了JIT预热等各方面的开销,比如
Oracle JDK 9就引入了实验性的AOT特性,并且增加了新的jaotc工具。
 
 
Java字节码的设计充分考虑了JIT这一即时编译方式,可以将字节码直接编译成高性能的本地机器码。

最新文章

  1. 理解 Neutron FWaaS - 每天5分钟玩转 OpenStack(117)
  2. 字节b换算kb/mb/gb/tb/pb
  3. 【leetcode】Remove Element (easy)
  4. python中使用xlrd、xlwt操作excel表格详解
  5. Json数据处理
  6. java与微信企业号交互
  7. js,jquery判断某一节点是否存在
  8. 初见Gnuplot——时间序列的描述
  9. 从零开始学ios开发(一):准备起航
  10. ubuntu 14.04 下FTP服务器的搭建--锁定用户目录,解决vsftpd: refusing to run with writable root inside chroot()
  11. Tolerance (定义发票允差)
  12. HDU3631:Shortest Path(Floyd)
  13. Scala从零开始:使用Intellij IDEA写hello world
  14. BZOJ_1342_[Baltic2007]Sound静音问题_单调队列
  15. Spring Boot 和 Docker 实现微服务部署
  16. P1090 合并果子 题解
  17. 【从零开始搭建自己的.NET Core Api框架】(二)搭建项目的整体架构
  18. HanLP vs LTP 分词功能测试
  19. WCF调错方法
  20. php 超时 解决办法 (Maximum execution time of 30 seconds exceeded)这个问题?

热门文章

  1. (五)pom文件详解
  2. c常用函数-strlwr 和 strupr
  3. Spring系列.AOP使用
  4. router-view中绑定key='$route.fullPath'
  5. 恕我直言你可能真的不会java第4篇:Stream管道流Map操作
  6. 慕课网--docker走进第一个javaweb应用
  7. SQL注入之常用工具sqlmap
  8. caffe的python接口学习(4)mnist实例手写数字识别
  9. Java常见23中设计模式之【代理模式】
  10. 四. sql上线平台