Java---Write once, run anywhere

Write once, run anywhere

    编写一次,到处运行,直观的描述了Java具有强的跨平台能力,Java的跨平台特性与Java虚拟机的存在密不可分,在不同的平台都有相应的JDK,安装好JDK就能给Java提供相应的运行环境,Write once, run anywhere体现在不同的平台都可提供Java运行的环境。

以下摘抄极客时间-Java核心技术三十六讲-杨晓峰谈Java平台理解
  Java本身是一种面向对象的语言,最显著的特性有两个方面,一是所谓的"书与一次,到处运行" (Write once, run anywhere) ,能够非常容易地获得跨平台能力;另外就是垃圾收集(GC, Garbage Collection ) , Java通过垃圾收集器( Garbage Coll ector )回收分配内存,大部分情况下,程序员不需要自己操心内存的分酉和回收
    我们日常会接触到JRE ( Java Runtime Environment )或者JDK ( Java DevelopmentKit ), JRE .也就是Java运行环境,包含了JVM和Java类库,以及一些模块等。而JDK可以看作是JRE的一个超集,提供了更多工具,比如编译器、各种诊断工具等。对于"Java是解释执行"这句话,这个说法不太准确。我们开发的Java的源代码, 首先通过Javac编译成为字节码( bytecode ) ,然后,在运行时,通过Java虚以机(JM )内嵌的解释器将字节码转换成为最终的机器码。 但是常见的JVM ,比如我们大多数情况使用的Oracle JDK提供的Hotspot JVM ,都提供了IT ( Just-In-Time )编译器,也就是通常所说的动态编译器, JIT能够在运行时将热点代码编译成机器码,这种情况下部分热点代码就属于编译执行,而不是解释执行了。

知识扩展
    回归正题,对于Java平台的理解,可以从很多方面简明扼要地谈一下,例如: Java语言特性,包括泛型Lambda等语言特性;基础类库,包括集合、10/NIO、网络、并发、安全等基础类库。对于我们日常工作应用较多的类库,面试前可以系统化总结一下,有助于临场发挥。或者谈谈JVM的一些基础概念和机制,比如Java的类加载机制,常用版本JDK (如JDK8)内嵌的Class-Loader,例Bootstrap. Application和Extension Class-loader;类加载大致过程:加载、验证、链接、初始化(这里参考了周志明的《深入理解Java虚拟机》 ,非常棒的JVM上手书籍) ;自定义Class-Loader等。还有垃圾收集的基本原理最常见的垃圾收集器,如SerialGC. Parallel GC. CMS、 G1等,对于适用于什么样的工作负载最好也心里有数。这些都是可以扩展开的领域,我会在后面的专栏对此进行更系统的介绍。
    当然还有JDK包含哪些工具或者Java领域内其他工具等,如编译器、运行时环境、安全工具、诊断和监控工具等。这些基本工具是日常工作效率的保证,对于我们工作在其他语言平台上,同样有所帮助,很多都是触类旁通的。
    众所周知,我们通常把Java分为编译期和运行时。这里说的Java的编译和C/C++是有若不同的意义的, Javac的编译,编译Java源码生成".class"文件里面实际是字节码,而不是可以直接执行的机器码。Java通过字节码和Java虚拟机(JVM )这种跨平台的抽象屏蔽了操作系统和硬件的细节,这也是实现“一次编译,到处执行"的基础。在运行时,JM会通过类加载器( Class-Loader )加载字节码,解释或者编译执行。 就像我前面提到的,主流Java版本中,如JDK 8实际是解释和编译混合的一种模式,即所谓的混合模式(-Xmixed) ,通常运行在server模式的/VM,会进行上万次调用以收集足够的信息进行高效的编译, client模式这个门限是1500次。Oracle Hotspot JVM内置了两个不同的JIT compiler, C1对应前面说的dlient模式,适用于对于启动速度敏感的应用,比如普通Java桌面应用;c2对应server模式,它的优化是为长时间运行的服务端应用设计的。默认是采用所谓的分层编译(TieredCompilation )。这里不再展开更多JIT的细节,没必要一下子就钻进去,我会在后面介绍分层编译的内容。Java虚拟机启动时,可以指定不同的参数对运行模式进行选择。比如,指定"-Xint" ,就是告诉JVM只进行解释执行,不对代码进行编译,这种模式抛弃了IT可能带来的性能优势。毕竟解释器( intenpreter )是逐条读入,逐g解释运行的。与其相对应的,还有一个"-Xcomp"参数,这是告诉JVM关闭解释器,不要进行解释执行,或者叫作最大优化级别。那你可能会问这种模式是不是最高效啊?简单说,还真未必。"-Xcomp"会导致JM启动变慢非常多,同时有些JT编译器优化方式,比如分支预测,如果不进行profiling ,往往并不能进行有效优化除了我们日常最常见的Java使用模式,其实还有一种新的编译方式,即所谓的AOT (Ahead-of-Time Compilation ) ,直接将字节码编译成机器代码,这样就避免了JIT预热等各方面的开销,比如Oracle JDK 9就引入了实验性的AOT特性,并且增加了新的jaotc工具。利用下面的命令把某个美或者某个模块编成为AOT库。

jaotc --output libHelloworld.so Helloworld.class 
jaotc --output libjava.base.so --module java.base

然后,在启动时直接指定就可以了。

java -xx:AOTLibrary=./libHelloworld.5o,./libjava.base.so Helloworld

    而且, Oracle JDK支持分层编译和AOT协作使用,这两者并不是二选一的关系。如果你有兴趣,可以参考相关文档: http://openidk.java.net/ieps/295, AOT也不仅仅是只有这一种方式,业界早就有第三方工具(如GCJ、 Excelsior JET )提供相关功能。
    另外,JM作为一个强大的平台,不仅仅只有Java语言可以运行在JVM上,本质上合规的字节码都可以运行, Java语言自身也为此提供了便利,我们可以看到类似Clojure.Scala, Groovy,JRuby, Jython等大量JVM语言,活跃在不同的场景。今天,我简单介绍了一下Java平台相关的一些内容,目的是提纲挈领地构建一个整体的印象,包括Java语言特性、核心类库与常用第三方类库、Java虚拟机基本原理和相关工具,希望对你有所帮助。

参考资料:极客时间-Java核心技术三十六讲-杨晓峰
ps:若有侵权,深感抱歉,请联系我删除。

你可能感兴趣的:(Java疑难问题,极客-Java学习笔记)