【Java】实战Java虚拟机之五“开启JIT编译”
今天开始实战Java虚拟机之五“开启JIT编译”
总计有5个系列
- 实战Java虚拟机之一“堆溢出处理”
- 实战Java虚拟机之二“虚拟机的工作模式”
- 实战Java虚拟机之三“G1的新生代GC”
- 实战Java虚拟机之四“禁用System.gc()”
- 实战Java虚拟机之五“开启JIT编译”
Java虚拟机有3种执行方式,分别是解释执行、混合模式和编译执行,默认情况下处于混合模式中。使用命令行java –version可以查看虚拟机的执行模式:
C:\Users\Administrator>java -version
java version "1.7.0_13"
Java(TM) SE Runtime Environment (build1.7.0_13-b20)
Java HotSpot(TM) 64-Bit Server VM (build 23.7-b01,mixed mode)
上面输出的“mixed mode”就表示混合模式。在混合模式中,部分函数会被解释执行,部分可能被编译执行。虚拟机决定函数是否需要编译执行的依据是判断该函数,是否为热点代码。如果函数的调用频率很高,被反复使用,那么就会被认为是热点,热点代码就会被编译执行。
解释执行模式表示全部代码均解释执行,不做任何JIT编译,可以使用参数-Xint来开启解释执行模式:
C:\Users\Administrator>java -Xint -version
java version "1.7.0_13"
Java(TM) SE Runtime Environment (build1.7.0_13-b20)
Java HotSpot(TM) 64-Bit Server VM (build 23.7-b01,interpreted mode)
编译执行模式和解释执行模式相反,对于所有的函数,无论是否是热点代码,都会被编译执行,使用参数-Xcomp可以设置为编译模式:
C:\Users\Administrator>java -Xcomp -version
java version "1.7.0_13"
Java(TM) SE Runtime Environment (build1.7.0_13-b20)
Java HotSpot(TM) 64-Bit Server VM (build 23.7-b01,compiled mode)
一般来说,编译模式的执行效率会远远高于解释模式。更多的示例参考《实战Java虚拟机》一书。
【示例11-36】下面的代码不停计算圆周率的数值,并给出了运行的耗时:
public static double calcPi(){
doublere=0;
for(inti=1;i<10000;i++){
re+=((i&1)==0?-1:1)*1.0/(2*i-1);
}
returnre*4;
}
public static void main(String[] args) {
longb=System.currentTimeMillis();
for(inti=0;i<10000;i++)
calcPi();
longe=System.currentTimeMillis();
System.out.println("spend:"+(e-b)+"ms");
}
使用虚拟机参数-Xint运行以上代码,输出:
spend:2794ms
使用虚拟机参数-Xcomp运行以上代码,输出:
spend:1082ms
很明显,在本例中使用编译运行要比解释运行快大约3倍。
《实战java虚拟机》一书Q交流群:397196583
【Java】实战Java虚拟机之五“开启JIT编译”的更多相关文章
- 实战Java虚拟机之四:提升性能,禁用System.gc() ?
今天开始实战Java虚拟机之四:"禁用System.gc()". 总计有5个系列 实战Java虚拟机之一“堆溢出处理” 实战Java虚拟机之二“虚拟机的工作模式” 实战Java虚拟 ...
- 实战Java虚拟机之三“G1的新生代GC”
今天开始实战Java虚拟机之三:“G1的新生代GC”. 总计有5个系列 实战Java虚拟机之一“堆溢出处理” 实战Java虚拟机之二“虚拟机的工作模式” 实战Java虚拟机之三“G1的新生代GC” 实 ...
- 实战Java虚拟机之二“虚拟机的工作模式”
今天开始实战Java虚拟机之二:“虚拟机的工作模式”. 总计有5个系列 实战Java虚拟机之一“堆溢出处理” 实战Java虚拟机之二“虚拟机的工作模式” 实战Java虚拟机之三“G1的新生代GC” 实 ...
- 实战Java虚拟机之一“堆溢出处理”
从今天开始,我会发5个关于java虚拟机的小系列: 实战Java虚拟机之一“堆溢出处理” 实战Java虚拟机之二“虚拟机的工作模式” 实战Java虚拟机之三“G1的新生代GC” 实战Java虚拟机之四 ...
- 实战java虚拟机的学习计划图(看懂java虚拟机)
啥也不说了,实战java虚拟机,好好学习,天天向上!针对自己的软肋制定学习计划. 一部分内容看完,自己做的学习笔记和感想. 学java很简单,但懂java会有难度,如果你的工资还没超过1W,那是时候深 ...
- 实战Java虚拟机之中的一个“堆溢出处理”
从今天開始.我会发5个关于java虚拟机的小系列: 实战Java虚拟机之中的一个"堆溢出处理" 实战Java虚拟机之二"虚拟机的工作模式" 实战Java虚拟机之 ...
- 你的java 代码对JIT编译友好吗?
JIT编译器是Java虚拟机(以下简称JVM)中效率最高并且最重要的组成部分之一.但是很多的程序并没有充分利用JIT的高性能优化能力,很多开发者甚至也并不清楚他们的程序有效利用JIT的程度. 在本文中 ...
- 你的Java代码对JIT编译友好么?(转)
JIT编译器是Java虚拟机(以下简称JVM)中效率最高并且最重要的组成部分之一.但是很多的程序并没有充分利用JIT的高性能优化能力,很多开发者甚至也并不清楚他们的程序有效利用JIT的程度. 在本文中 ...
- 【深入Java虚拟机】之七:Javac编译与JIT编译
转载请注明出处:http://blog.csdn.net/ns_code/article/details/18009455 编译过程 不论是物理机还是虚拟机,大部分的程序代码从开始编译到最终转化成物理 ...
随机推荐
- ASP.NET Core--基于授权的资源
翻译如下: 通常授权取决于正在访问的资源. 例如,文档可以具有作者属性. 将只允许文档作者对其进行更新,因此必须在进行授权评估之前从文档存储库加载资源. 这不能使用Authorize属性来完成,因为属 ...
- C++基础知识(3)---new 和 delete
学过c语言的人都知道,c语言中动态分配内存空间使用的是库函数malloc,calloc,realloc以及free.而c++中所使用的是关键字new和delete.如 动态分配 new , 撤销内 ...
- BZOJ 4576: [Usaco2016 Open]262144
Description 一个序列,每次可以将两个相同的数合成一个数,价值+1,求最后最大价值 \(n \leqslant 262144\) Sol DP. 这道题是 BZOJ 4580: [Usaco ...
- espcms列表页ajax无限加载
类似百度图片的效果,滚动到底部后,点击加载更多,加载出第二页,第三页... 替代了传统的上一页,下一页,第几页,以达到在某些情况下使得用户体验更好. 二次开发方法: 1.先在模板文件中增加ajax文件 ...
- Magento 创建新的数据实体 model 、 resource 和 collection 文件
一.创建model文件 class Bestbuy_PrepaidCard_Model_Used extends Mage_Core_Model_Abstract { protected ...
- [jquery]添加行内容后根据下拉菜单选择内容对比之前已有选项,若有重置再提示
今天页面上一个添加列内容时,要对选择内容与之前已有选项内容作对比,防止用户重复选择内容 页面HTML代码 <ul class="list-group xj-list-NObor xj- ...
- listView当中有嵌套了有onClickListener的控件时ListView自身的onItemClick无响应的解决方案
Ref:http://www.cnblogs.com/bluestorm/archive/2013/03/24/2979557.html android:descendantFocusability ...
- Delphi多线程编程--线程同步的方法(事件、互斥、信号、计时器)简介
更详细的可以参考:http://www.cnblogs.com/xumenger/p/4450659.html 或者参考之后的博客 四个系统内核对象(事件.互斥.信号.计时器)都是线程同步的手段,从这 ...
- ORA-01102 报错解决方法
Problem Explanation: ==================== A database is started in EXCLUSIVE mode by default. Th ...
- java中定时器的四种方法
package com.lid; import java.util.Calendar; import java.util.Date; import java.util.Timer; import ja ...