前言

这几天重新研究了一下内存模型、内存屏障,在学习内存屏障的时候,了解了lock前缀指令,为了编译出lock前缀指令,于是去学了一下字节码指令。因为还要添加一些运行参数,于是今天又看了一下午JVM的编译问题。知识一环套一环,现在内存屏障这一块还没搞完。这可能也正是自学乐趣之所在,知识无限延展,层层连贯,于是晚上就整理了一下关于java编译方面总结。

Java代码如何运行

我们写的Java代码是高级语言,机器肯定是读不懂的。所以我们需要将它转换成机器能读懂的机器语言(机器码)。

转换工作主要分为以下几个步骤:

前端编译器

javac就是前端编译器,可以将java文件编译成字节码组成的class文件。

java代码如下:

public class Info {

public static void main(String[] args) {

int a = 1;

System.out.println(a);

}

}

执行javac Info.java生成Info.class文件,再使用javap -c Info.class来查看其中的字节码。

class中字节码内容如下:

解释器和即时编译器

我们通过javac将java文件编译成class文件,当jvm启动加载class,需要逐条执行字节码指令来完成程序功能。但是程序的执行还是得在机器上,但是机器是不认识字节码的,所以我们需要将字节码转换成机器码,这样才能让机器执行程序。

什么是机器码?

机器码就是用二进制代码表示的计算机能直接识别和执行的一种机器指令的集合。

而解释器和即时编译器(Just In Time Compiler,JIT)就是JVM中将字节码转化为机器码的工具。

解释器

解释器是一行一行地将字节码解析成机器码,解释到哪就执行到哪,狭义地说,就是for循环100次,你就要将循环体中的代码逐行解释执行100次。当程序需要迅速启动和执行时,解释器可以首先发挥作用,省去编译的时间,立即执行。

即时编译器(JIT)

即时编译器按照我的理解就是:以方法为单位,将热点代码的字节码一次性转为机器码,并在本地缓存起来的工具。避免了部分代码被解释器逐行解释执行的效率问题。

即时编译器分为两种,Client Compiler(C1编译器)和Server Compiler(C2),默认使用的是C2,因其运行性能更高。

什么是热点代码?

被多次调用的方法和循环体被认定为热点代码。热点代码的判断方法有两种,一是基于采样的热点探测:周期检查每个线程栈顶,统计哪个方法出现次数多,但是不准确;二是基于计数器的热点探测:目前在用,为每个方法建立计数器,统计方法的调用次数。计数器分为方法调用计数器(默认阈值C1是1500次,C2是1w,到达阈值则触发即时编译)和回边计数器(统计一个方法中循环体的执行次数)。

下图为方法调用计数器的执行过程:

目前主流的HotSpot虚拟机中默认是采用解释器与其中一个编译器(C2编译器)直接配合的方式将字节码转换成机器码

运行参数

在执行java程序的时候,以下参数是和编译方面的运行及调试参数。

结语

主要讲述编译器和解释器一些概念性的东西,如果觉得有些地方解释的不够透彻,可以空余时间研究一下《深入理解Java虚拟机规范》。

java解释器怎么写_Java解释器和编译器相关推荐

  1. java程序怎么写_java程序怎么写

    java程序怎么写? 一个Java程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作.下面简要介绍下类.对象.方法和实例变量的概念. 推荐教程:<java学习> 对象: ...

  2. java方法怎么写_java方法定义格式详解,java方法怎么写?

    对于java方法你了解多少呢?你知道java方法应该如何写吗?下面要给大家介绍的就是和java方法相关的内容,一起来了解一下这个概念吧. 在学习运算符的时候,都为每个运算符单独的创建一个新的类和mai ...

  3. java过滤器怎么写_java过滤器怎么写

    1.java过滤器中实现Filter的类怎么写 web.xml配置文件 SessionFilter com.qhit.system.tools.SessionFilter SessionFilter ...

  4. java注解怎么写_java注解

    写在前面 现在的java主流框架中,注解无处不在,因此我们完全有必要搞明白注解到底是什么.如何理解注解,它到底是怎么起作用的. 注解的定义 java是这样定义注解的:Java 注解用于为 Java 代 ...

  5. java add() 自己写_java问题 编写一个程序,用以重写父类Addition中名为add()的抽象方法。...

    展开全部 其实,我觉得我写的这个不太好,你看看吧 Addition类public abstract class Addition { protected T item1; protected T it ...

  6. java 抽象方法怎么写_java抽象方法怎么写

    1. java中什么叫抽象方法和抽象类及他们的特点,说的具体些,写个例子 7.何为抽象方法和抽象类? 马 克 -to -win:方法前有个abstract修饰符,就叫抽象方法.类前有个abstract ...

  7. java挡板怎么写_Java挡板接小球游戏

    版权声明:© 2018 chashu All Rights Reserved.https://blog.csdn.net/tongshuyang/article/details/83054905 虽然 ...

  8. word中添加java代码怎么写_Java如何在word文档中写一个段落?

    在Java编程中,如何在word文档中写一个段落? 注意:需要访问网址:http://poi.apache.org/download.html , 下载一个Apache POI软件包.这里下载最新版本 ...

  9. java 交集怎么写_Java里面如何求两个集合的交集

    在Python里,或许我们没有这个烦恼,因为python里已经为我们提供了intersection这样的方法. 但是在Java里,就需要我们动一番脑筋了.这里浓重推荐下apache的Collectio ...

最新文章

  1. 终于明白 Java 为什么要加 final 关键字了!
  2. python空行拼接字符串_python基础---文本和字符串操作
  3. Python中断多重循环的几种思路
  4. “面试不败计划”: java语言基础面试题(三)
  5. 数据结构与算法-二叉树(java描述)
  6. 18个常用的JavaScript片段分享
  7. 美国本科计算机科学,美国本科计算机科学就业情况分析
  8. Swift之深入解析“属性”的底层原理
  9. 【牛客 - 283C】模拟只会猜题意(简单模拟)
  10. JSON 格式化 显示到页面中
  11. java 防重_如何做一个防重设计
  12. Oracle使用NLSSORT函数实现汉字的排序
  13. 【Pandas】CSV文件读取时手动指定头部
  14. SQL获取当前日期函数
  15. Excel:INDIRECT函数
  16. 创造生命奇迹的幸存者
  17. 全球 40 位 40 岁以下的富豪
  18. shell 后台运行
  19. 【沐风老师】3dMax Gyroid Minimal Surface 极小曲面建模详细教程
  20. 住房公积金联名卡密码修改步骤

热门文章

  1. 使用nosetests对webpy程序做单元测试
  2. 如何关联php5与apche,PHP5在Apache下的两种模式的安装_php
  3. Linux常用命令大全(持续更新)
  4. L1-065 嫑废话上代码 (5 分)-PAT 团体程序设计天梯赛 GPLT
  5. PAT 1083. 是否存在相等的差 (20) - 乙级
  6. java中对象与字节数组相互转换
  7. 榛子云短信-微信小程序60秒倒计时插件
  8. Thumbelina,摘自iOS应用Snow White and more stories
  9. complete_code_Chapter1
  10. centos7设置输入密码三次错误锁定账号