从你接触 Java 开发到现在,你对 Java 最直观的印象是什么呢?是它宣传的 “Complier once, run anywhere”,还是目前看已经有些过于形式主义的语法呢?你对于 Java 平台到底了解到什么程度?请你先停下来总结思考一下。

今天的问题是:谈谈你对java的理解,java是“解释执行”这句话对吗?

先科普下什么是“解释执行”? 什么是“编译执行”?

  • 解释执行
    解释执行时高级语言翻译程序的一种方式,它将源语言(如VASIC)书写的源程序作为输入,解释一句后就提交给计算机执行一句,并不生成目标程序。这种方式很适合终端与人的交互,在终端输入一个命令,解释程序立即将该命令解释成一条或者多条计算机指令提交硬件执行计算,并将计算结果返回终端。这的确很方便,但是执行效率也会很低,假如源程序中有循环,解释程序也不断的提交这段循环代码,造成不必要的浪费。

  • 编译执行
    先将源代码编译成目标语言(如:计算机语言)之后通过连接程序生成目标程序进行执行。

    这是一类很重要的语言处理程序,它把高级语言(如Pascal、C等)源程序作为输入,进行翻译转换,产生出机器语言的目标程序,然后再让计算机去执行这个目标程序,得到计算结果。

典型的回答

java是一门面向对象的编程语言,它有两个非常显著的特征:1. Compile once, run anywhere,能够很容易的获得跨平台的能力。2.提供垃圾收集器,java提供垃圾收集器回收分配内存,大部分情况下程序员不需要关注内存分配问题。

我们日常会接触到JDK或者JRE,JRE是java的运行时环境,包含了java类库和jvm。JDK则是JRE的一个超集,提供了更多的工具,比如编译工具,诊断工具等。

对于java是解释执行的,这种说法不太准确。我们开发的java源代码,首先经过javac编译成字节码,然后通过java虚拟机(JVM)内嵌的解释器解释成机器码。但是常见的JVM,如常用的Oracle JDK提供的Hotspot JVM内部都提供了 JIT(Just-In-Time)编译器,也就是通常所说的动态编译器,JIT 能够在运行时将热点代码编译成机器码,这种情况下部分热点代码就属于编译执行,而不是解释执行了。

什么是JIT?

在部分的商用虚拟机中,Java 程序最初是通过解释器( Interpreter )进行解释执行的,当虚拟机发现某个方法或代码块的运行特别频繁的时候,就会把这些代码认定为“热点代码”。为了提高热点代码的执行效率,在运行时,即时编译器(Just In Time Compiler )会把这些代码编译成与本地平台相关的机器码,并进行各种层次的优化。

解释器和编译器各有各的优点:

解释器优点:当程序需要迅速启动的时候,解释器可以首先发挥作用,省去了编译的时间,立即执行。解释执行占用更小的内存空间。同时,当编译器进行的激进优化失败的时候,还可以进行逆优化来恢复到解释执行的状态。

解释器优点:在程序运行时,随着时间的推移,编译器逐渐发挥作用,把越来越多的代码编译成本地代码之后,可以获得更高的执行效率。

因此,整个虚拟机执行架构中,解释器与编译器经常配合工作,如下图所示。

我们通常把Java分为编译器和运行时。java 的编译和c/c++不同。java的编译时把java源码文件编译成.clss的字节码文件,并不是机器可执行的机器码。Java 通过字节码和 Java 虚拟机(JVM)这种跨平台的抽象,屏蔽了操作系统和硬件的细节,这也是实现“一次编译,到处执行”的基础。

在运行时,JVM是用类加载器加载字节码(.class)解释或者编译执行。主流 Java 版本中,如 JDK 8 实际是解释和编译混合的一种模式,即所谓的混合模式(-Xmixed)

通常在Server模式的JVM,会进行上万次的调用以收集足够的信息进行高效的编译,Client模式下为1500次

Java 虚拟机启动时,可以指定不同的参数对运行模式进行选择。 比如,指定“-Xint”,就是告诉 JVM 只进行解释执行,不对代码进行编译,这种模式抛弃了 JIT 可能带来的性能优势。毕竟解释器(interpreter)是逐条读入,逐条解释运行的。与其相对应的,还有一个“-Xcomp”参数,这是告诉 JVM 关闭解释器,不要进行解释执行,或者叫作最大优化级别。那你可能会问这种模式是不是最高效啊?简单说,还真未必。“-Xcomp”会导致 JVM 启动变慢非常多,同时有些 JIT 编译器优化方式,比如分支预测,如果不进行 profiling,往往并不能进行有效优化。

拓展回答

可参考下图进行拓展

谈谈你对java平台的理解相关推荐

  1. Java 面试经典题解析:谈谈你对 Java 平台的理解?

    作者|杨晓峰出处|极客时间<Java技术核心 36讲>专栏 从你接触 Java开发到现在,你对 Java最直观的印象是什么呢?是它宣传的 "Compile once, run a ...

  2. 杨晓峰-java核心技术36讲(学习笔记)- 第1讲 | 谈谈你对Java平台的理解?

    杨晓峰-java核心技术36讲(学习笔记) 接下来我会分享杨晓峰-java核心技术36讲的学习笔记,内容较多,补充了其中一些牛人评论,相对详细(仅供个人学习记录整理,希望大家支持正版:https:// ...

  3. [java]谈谈你对Java平台的理解

    Java特性: 面向对象(封装,继承,多态) 平台无关性(JVM运行.class文件) 语言(泛型,Lambda) 类库(集合,并发,网络,IO/NIO) JRE(Java运行环境,JVM,类库) J ...

  4. Java核心技术36讲 第一讲:Java平台的理解

    java语言 一次编译,到处运行 GC.Garbage Collection JRE: Java Runtime Environment 包含JVM和Java类库等 JDK: Java Develop ...

  5. 对java的集合的理解_谈谈你对java集合类的理解

    数组是集合的一种,是集合的一个子集,你理解了数组就理解了集合.理解集合类集合类存放于java.util包中.集合类存放的都是对象的引用,而非对象本身,出于表达上的便利,我们称集合中的对象就是指集合中对 ...

  6. 对Java平台的理解

    1.Java是面向对象的语言,他有两大特性 一是跨平台能力,也就是"书写一次,到处运行",这点与java虚拟机密不可分,不同平台有不同的JDK,安装好对应JDK就有了Java的运行 ...

  7. Java生鲜电商平台-深入理解微服务SpringCloud各个组件的关联与架构

    Java生鲜电商平台-深入理解微服务SpringCloud各个组件的关联与架构 概述 毫无疑问,Spring Cloud是目前微服务架构领域的翘楚,无数的书籍博客都在讲解这个技术.不过大多数讲解还停留 ...

  8. 谈谈你对Java的理解

    谈谈你对Java的理解 这个考察的很宽泛,答案不是唯一的,往往考察多个方面,其实这个问题考察的是你是否真的掌握了Java,对基础知识点的理解是否真的很清楚.是否掌握主要的模块和运行 原理等,同时也会对 ...

  9. 谈谈你对java的理解,java是“解释执行”这句话对吗?

    谈谈你对java的理解,java是"解释执行"这句话对吗? 先科普下什么是"解释执行"? 什么是"编译执行"? • 解释执行 解释执行时高级 ...

最新文章

  1. R语言ggplot2可视化:使用R原生plot函数为指定曲线下面的区域着色、ggplot2可视化在曲线的特定下方添加分割线、ggplot2为指定曲线下面的区域着色
  2. 2017年最受欢迎的10个编程挑战网站
  3. 无线宝服务器连接不上,无线网络连接不上怎么办 为什么无线网络连接不上
  4. FIELD SYMBOL和TYPE REF TO的用法和比较
  5. k8s command args
  6. Hadoop自学笔记(三)MapReduce简单介绍
  7. epoll的两种模式
  8. edge浏览器怎么设置activex_微软在新Edge浏览器中拒绝了ActiveX插件技术
  9. high definition audio控制器感叹号_三门峡回收科霸控制器
  10. php+ajax+js注册源码,将Ajax封装至js文件中(用户注册源码实例)
  11. BZOJ1086 [SCOI2005]王室联邦(树分块)
  12. python简单代码恶搞-python—做一个恶搞程序
  13. PB 9.0 连接系统自带数据库步骤
  14. c语言数组存在哪个地方,C语言数组考点归纳
  15. oracle数据库中TDS,某高校开发了一个学生信息管理系统TDS,里面使用了Oracle数据库。则TDS被称为...
  16. 用流量扫码总显示无法连接服务器,手机有流量但无法连接网络?手机数据网络不能访问互联网...
  17. JAVA面向对象编程——学生喂养三种宠物:猫、狗和鸟
  18. 03独立按键控制LED移动
  19. 抗肿瘤靶向药物丨小分子化合物 or 单克隆抗体?- MedChemExpress
  20. Android实现手机内存存储功能

热门文章

  1. Managers Fared Better Than Their Funds
  2. 凝聚智慧打造哈市智慧城管平台助推城市管理创新
  3. 大数据系列教程003-hadoop伪分布式环境搭建步骤03-安装虚拟机CentOS7
  4. 批量伪原创工具,支持各种CMS,API接口发布
  5. JZOJ4870. 涂色游戏
  6. Oracle更换存储磁盘,oracle11g crs在线更换asm磁盘
  7. php面试题__语言基础
  8. Linux学习笔记之 LVM
  9. pack_padded_sequence和pad_packed_sequence详解
  10. jboss7.11配置数据源