JAVA平台的理解
主题: JAVA是解释执行还是编译执行?
我的答案 : 混合模式
闲谈 :
1. JAVA(write once,run anywhere);
2. GC(Garbagae Collection),Java通过垃圾收集器回收分配内存,大部分情况下,程序猿不需要自己操心内存的分配和回收。
3. JRE,也就是java运行环境,包含了JVM和JAVA类库,以及一些模块等。而JDK可以看做是JRE的一个超集,提供了更多工具,比如编译器、
各种诊断工具等。
步入主题:
对于“Java是解释执行”这句话,这个说法不太准确。 我们看流程, 我们开发的JAVA源代码,首先通过Javac编译成为字节码(bytecode),然后,在运行时,通过
JAVA虚拟机(JVM)内嵌的解释器将字节码转换成为最终的机器码。(但是常见的JVM,比如我们大多数情况使用的Oracle JDK提供的Hotspot JVM,都提供了JIT(Just-In-
Time)编译器,也就是通过所说的动态编译器,JIT能够在运行时将热点代码编译成机器码,这种情况下部分热点代码就属于编译执行了,而不是解释执行了。)
这里,我们来研究2点,从上面的话可以看出,基本上比较普遍的情况就是解释执行,但是JIT有时也能出现,这就是避免了主要重复的业务代码暂居大部分开销的情况。
第二个点是:什么是 编译执行,解释执行。
编译型语言:在程序运行之前,有一个单独的编译过程,将程序翻译成机器语言,以后执行这个程序时,就不用再进行翻译了。
解释型语言:是在运行的时候将程序翻译成机器语言,所以运行速度相对于编译型语言要慢。
SO,二者之间最大的区别就在于是否存下目标机器码:编译会把输入的源程序以某种单位(例如基本块/函数/方法/trace等)翻译生成目标机器码,并存下来(无论是在磁盘上或是内存中)后续执行可以复用;解释则是把源程序中的指令逐条解释执行,边解释边执行,不存下目标代码,后续执行没有可以复用的信息。
了解Java的运行过程:Java源文件(*.java),通过java编译器(javac)编译生成一个ByteCode字节码文件(*.class),字节码由java自己设计的一个计算机(即java虚拟机,JVM)解释执行,虚拟机将每一条要执行的字节码送给解释器,解释器将其翻译成特定机器上的目标机器码,然后在特定的机器上运行。
所以说Java的解释器的优点是比较容易让用户实现自己跨平台的代码,同一套代码可以在几乎所有的操作系统上执行。
(这里提一下java的跨平台Write Once,Run Anywhere:java的跨平台是基于JVM的。JVM是在一台计算机上由软件或是硬件模拟的计算机,java程序所有的*.class文件都是在JVM上运行的,也就是说*.class文件只需认JVM,由JVM去适应各个操作系统,所以不同的操作系统只要安装符合其类型的JVM,那么程序无论到哪个OS上都是可以正确执行的JVM for Unix / JVM for Windows / JVM for Other……,因此没有JVM也就不能跨平台)
虽然Java的第一道工序是javac编译,其目标文件是ByteCode,而并非机器语言,但后续可能有三种处理方式:
1、运行时,ByteCode由JVM逐条送给解释器,解释器将翻译成机器码运行。
2、运行时,部分ByteCode可能由实时编译器(Just In Time Compiler,JIT)编译为目标机器码再执行(以method为翻译单位,还会保存起来,第二次执行就不用再翻译为机器码了),因为考虑到有些JVM是采用纯JIT编译方式实现的,其内部没有解释器,例如:JRockit、Maxine VM。
3、RTSJ,继javac之后执行AOT二次编译,生成静态的目标平台码。
有的时候,可能是以上三种方式同时在使用,至少,1和2是同时使用的,3则需要程序员手工指定。
补充 :
1. JDK 8 实际上是解释和编译混合的一种模式,即所谓的混合模式(-Xmixed)。通过运行在server模式的JVM,会进行上万次调用以收集足够的信息进行高效的编译,
client模式这个门限是1500次。oracle HotSpot JVM 内置了2个不同的JIT compiler,C1对应前面说的client模式,适用于对于启动速度敏感的应用,比如java桌面应用。
C2对应server模式,他的优化是为长时间运行的服务器端应用设计的。默认是采用所谓的分层编译(TieredCompilation)。
2. Java虚拟机启动是,可以指定不同的参数对运行模式进行选择。比如,指定“-Xint”,就是告诉JVM只进行解释执行,不对代码进行编译,这种模式抛弃了JIT可能带来的
性能优势。毕竟解释器(interpreter)是逐条读入,逐条解释运行的。与其对应的,还有一个“-Xcomp”参数,这就是告诉JVM关闭解释器,不要进行解释执行,或者叫做
最大优化级别。(但是这种模式并不意味着最高效)。xcomp会导致JVM启动变慢非常多,同时有些JIT编译器优化方式,比如分支预测,如果不进行profiling,
往往并不能进行有效优化。
3. AOT(Ahead-of-Time Compilation),直接将字节码编译成机器代码。这样就避免了JIT预热等各方面的开销,比如Oacle JDK 9 就引入了实验性的AOT特性,并且增加了
新的 jaotc 工具。利用下面的命令把某个类或者某个模块编译成为AOT库。
jaotc --output libHelloWorld.so HelloWorld.class
jaotc --output libjava.base.so --module java.base
然后,在启动时直接指定就可以了。
java -XX:AOTLibarary=./libHelloWorld.so,./libjava.base.so HelloWorld
而且, oracle jdk 支持分层编译和AOT协作使用,这2者并不是二选一的关系。可参考: http://openjdk.java.net/jeps/295
4. 同时,类似JVM这种跨平台特性,就像JAVA当中“解耦”这种艺术手法一样,在Scale,Groovy,Jruby等语言上,也得到了体现。
JAVA平台的理解的更多相关文章
- 谈谈你对 Java 平台的理解
		声明 本篇所涉及的提问,正文的知识点,全都来自于杨晓峰的<Java核心技术36讲>,当然,我并不会全文照搬过来,毕竟这是付费的课程,应该会涉及到侵权之类的问题. 所以,本篇正文中的知识点, ... 
- 《Java核心技术36讲》阅读笔记:谈谈对Java平台的理解笔记
		1. 谈谈你对Java平台的理解. Java是一种面向对象的语言,最显著的特性有两个方面: 一个就是一次编译,到处运行(Write once, run anywhere),能够非常容易的获得跨平台能力 ... 
- Java-谈谈对Java平台的理解
		问题 谈谈对 Java 平台的理解 Java是解释执行的 这句话对么 程序的编译与解释有什么区别 Java 平台的了解 Java的主要特点是两个, 编写一次到处运行 Write once, run a ... 
- 2018.7.26 进程和线程的区别  &&你对 Java平台的理解
		进程和线程的区别 1.定义 进程:具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程:进程的一个实体,是CPU调度和分派的基本单位,它是比进程更 ... 
- java面试题(杨晓峰)---第一讲谈谈你对java平台的理解
		本人总结: 面向对象(封装,继承,多态) 平台无关性(jvm运行,class文件) 语言(泛型,lambda) 类库(集合,并发,网络,io/nio) jre(java运行环境,JVM,类库) JDK ... 
- 1.谈谈对Java平台的理解
		1.谈谈你对Java平台的理解 Java 本身是一种面向对象的语言,最显著的特性有两个方面,一是所谓的“一次编译,到处运行”(Compile once,run anywhere),能够非常容易地获取跨 ... 
- 谈谈你对java平台的理解?
		问题:谈谈你对java平台的理解?java是解释执行,这句话对吗? 典型回答:java本身是一种面向对象的语言,具有很好的跨平台的能力,能够做到“write once ,run anywhere”.另 ... 
- Java核心-01 谈谈你对Java平台的理解
		今天我要问你的问题是,谈谈你对 Java 平台的理解?“Java 是解释执行”,这句话正确吗? 典型回答 Java本身是一种面向对象的语言,最显著的特性有两个.一是所谓的“书写一次,到处运行”,能够非 ... 
- 谈谈对Java平台的理解
		从我第一次接触Java的时候,老师就说"Write once,run anywhere",这句话虽然听起来有一点太过于形式主义,但是也突出了它的特点.那么,现在的我们应该总结一下和 ... 
- 对Java平台的理解
		1) Java是一种面向对象的语言(封装,继承,多态),最显著的特性有两个方面: ----书写一次,到处运行(Write once,run anywhere) 能够非常容易的获得跨平台的能力 --- ... 
随机推荐
- POJ 2750 Potted Flower(线段树+dp)
			题目链接 虽然是看的别的人思路,但是做出来还是挺高兴的. 首先求环上最大字段和,而且不能是含有全部元素.本来我的想法是n个元素变为2*n个元素那样做的,这样并不好弄.实际可以求出最小值,总和-最小,就 ... 
- CentOS笔记-磁盘管理
			Linux磁盘管理常用三个命令为df.du和fdisk. df:列出文件系统的整体磁盘使用量 du:检查磁盘空间使用量 fdisk:用于磁盘分区 df [-ahikHTm] [目录或文件名] -a : ... 
- mongo-java-driver
			http://mvnrepository.com/artifact/org.mongodb/mongo-java-driver/3.5.0 <!-- https://mvnrepository. ... 
- 使用POCO发送HTTP(S)请求
			POCO GitHub地址https://github.com/pocoproject/poco http_example.cpp #include <iostream> #include ... 
- 新产品为了效果,做的比較炫,用了非常多的图片和JS,所曾经端的性能是非常大的问题,分篇记录前端性能优化的一些小经验。
			第一篇:HTTPserver 因tomcat处理静态资源的速度比較慢,所以首先想到的就是把全部静态资源(JS,CSS,image,swf) 提到单独的server,用更加高速的HTTPserver,这 ... 
- PHP获取类名及所有函数名
			PHP获取当前类名.方法名 __CLASS__ 获取当前类名 __FUNCTION__ 当前函数名(confirm) __METHOD__ 当前方法名 (bankcard::confirm) _ ... 
- FZU1977 Pandora adventure —— 插头DP
			题目链接:https://vjudge.net/problem/FZU-1977 Problem 1977 Pandora adventure Accept: 597 Submit: 2199 ... 
- HDU3746 Cyclic Nacklace —— KMP 最小循环节
			题目链接:https://vjudge.net/problem/HDU-3746 Cyclic Nacklace Time Limit: 2000/1000 MS (Java/Others) M ... 
- PLSQL 安装说明
			PLSQL安装说明. 1.安装oracle 11g ,2030端口设置防火墙例外.2.PLSQL Developer 9.0.0.1601是绿色版,复制到本地即可.3.PLSQL->Tools- ... 
- YTU 2442: C++习题 矩阵求和--重载运算符
			2442: C++习题 矩阵求和--重载运算符 时间限制: 1 Sec 内存限制: 128 MB 提交: 1457 解决: 565 题目描述 有两个矩阵a和b,均为2行3列.求两个矩阵之和.重载运 ... 
