从我第一次接触Java的时候,老师就说"Write once,run anywhere",这句话虽然听起来有一点太过于形式主义,但是也突出了它的特点。那么,现在的我们应该总结一下和思考一下,自己对于Java平台的理解。

Java本身是一种面向对象的语言,最显著的两个特性有两个方面:

  ①、书写一次,到处运行,具有跨平台的能力;

  ②、具有垃圾收集(GC,Garbage Collection)功能,Java通过垃圾收集器(GC)回收分配内存,大部分情况下,程序员不需要自己担心内存的分配和回收。

还有,我们日常还会接触到JRE(Java Runtime Environment)或者JDK(Java Development Kit)。JRE,也就是Java运行环境,包含了JVM和Java类库,以及一些模块等。而JDK可以看做是JRE的一个超集,提供了更多工具,比如编译器,各种诊断工具等。

那么,在一些面试题中,还会出现这么一个问题,"对于Java是解释执行",这句话正确吗?

在这里,我们可以分析一下。当然,这个说法是不太准确的。我们开发的Java源代码,首先是通过Javac编译成为字节码(bytecode),然后,在运行时,通过Java虚拟机(JVM)内嵌的解释器将字节码转换成为最终的机器码。但是常见的JVM,比如我们大多数情况下使用的Oracle JDK提供的Hotspot JVM,都提供了JIT(Just-In-Time)编译器,也就是通常所说的动态编译器,JIT能够在运行时将热点代码编译成机器码,这种情况下部分热点代码就属于编译执行,而不是解释执行了。

对于Java平台的理解,还可以从很多方面进行分析,例如:Java语言特性,包括泛型,Lambda等语言特性;基础类库,包括集合、IO/NIO、网络、并发、安全等基础类库等。或者谈谈JVM的一些基础概念和机制,比如Java的类加载机制,常用版本JDK(如JDK8)内嵌的Class-Loader,例如Bootstrap、Application和Extension Class-Loader;类加载大致过程:加载、验证、链接、初始化;自定义Class-Loader等。还有垃圾收集的基本原理,最常见的垃圾收集器,如SerialGC、ParallelGC、CMS、G1,对于适用于什么样的工作负载最好也心里有数。这些都是可以进行自我拓展的领域。

众所周知,我们通常把Java编译期和运行时。这里说的Java编译和C/C++是有着不同意义的,Javac的编译,编译Java源码生成".class"文件里面实际是字节码,而不是可以直接执行的机器码。Java通过字节码和Java虚拟机(JVM)这种跨平台的抽象,屏蔽了操作系统和硬件的细节,这也实现"一次编译,到处执行"的基础。

在运行时,JVM会通过类加载器(Class-Loader)加载字节码,解释后者编译执行。在主流Java版本中,如JDK8实际是解释和编译混合的一种模式,即所谓的混合模式(-Xmixed)。通常运行在server模式的JVM,会进行上万次调用以收集足够的信息进行高效的编译,client模式这个门限是1500次。Oracle Hotspot JVM内置了两个不同的JIT compiler,C1对应前面说的client模式,适用于对于启动速度敏感的应用,比如普通Java桌面应用;C2对应server模式,它的优化是为长时间运行的服务器端应用设计的。默认是采用所谓的分层编译(TieredCompilation)。

除了我们日常最常见的Java使用模式,其实还有一种新的编译方式,即所谓的AOT(Ahead-of-Time Compilation),直接将字节码编译成机器代码,这样就避免了JIT预热等各方面的开销,比如Oracle JDK9就引入了实验性的AOT特性,并且增加了新的jaotc工具。而且,Oracle JDK支持分层编译和AOT协作使用,这两者并不是二选一的关系。

另外,JVM作为一个强大的平台,不仅仅只有Java语言可以运行在JVM上,本质上合规的字节码都可以运行,Java语言自身也为此提供了便利。

最新文章

  1. NetworkComms V3 模拟登陆
  2. 找出html中的图片、包括css中的图片,读出图片数据转换为base64数据
  3. fastCGI (二)各方优劣
  4. JFinal搭建时,提示着不到contextpath
  5. ASPNETMVC多语言方案
  6. Codeforces 449D Jzzhu and Numbers
  7. 2018ICPC青岛现场赛 重现训练
  8. 写好的Java代码在命令窗口运行——总结
  9. 转载 【.NET基础】--委托、事件、线程(1) https://www.cnblogs.com/chengzish/p/4559268.html
  10. Windows server 2008 r2下载地址和激活破解方法
  11. 何时使用SUM()与SUMX()
  12. A Spy in the Metro(UVA 1025 ACM/ICPC World Finals2003)
  13. 两台计算机有相同的IP地址会发生什么情况?两台计算机有相同的MAC地址会发生什么情况?
  14. js生成简单二维码
  15. flask——包含,继承,宏
  16. HTML5 之 FileReader 方法上传并读取文件
  17. vue-cli 添加less 以及sass
  18. SELINUX导致数据修改权限不成功
  19. VS.Net开发必备,让您的代码自动收缩,如何实现!
  20. eclipse 设置字体大小

热门文章

  1. cnn卷积理解
  2. C# - 设计- Struct与Class的选择
  3. 05-Python模块
  4. day1:注释和变量
  5. Python 爬取异步加载的数据
  6. linux目录结构 主流Linux发行版的目录结构
  7. v-bind v-on 缩写
  8. Makefile中的奇葩字符
  9. 主机无法访问虚拟机中运行的Django项目
  10. 关于Type-C扩展坞干扰路由器交换机的解决方案