Java平台初映象

很多从事开发很多年的“经验丰富的开发人员”,往往对自己手中的工具不甚了解。今天在这里简单聊一聊,什么是Java?它为何可以屹立多年不倒?并且还能迅速的渗透到最新的生产领域?

一、Java语言的特性

Java语言本身的特性也正可以体现它的优点,只有足够多的优点才能让Java成为人们钟爱的编程语言。那么Java语言有哪些特性呢?

面向对象语言

比起C语言、Fortran语言之类的面向过程的语言,面向对象的语言将对象作为程序的基本单元,将程序和数据封装在其中,具有更高的灵活性、扩展性,也更利于软件的重用。面向对象不仅仅指的是一种程序设计方法,它更多的是一种程序开发方式。但是面向对象的程序语言有很多,比如C++、Python、C#,为什么Java会胜出呢?

跨平台

跨平台是Java最为人所乐道的一个特点,所谓“write once, run anywhere”的本质就是跨平台。跨平台是指的只需要一次编译就可以在不同的平台上运行,这里需要和可移植做一下区别。可移植是指经过简单的编译可以在不同的平台上运行。跨平台之所以可以实现,是通过JVM作为媒介,javac将源码编译成字节码,JVM和字节码屏蔽了操作系统和硬件的细节。

垃圾回收机制

垃圾回收机制是Java中一个重要的机制,不同于C之类的早期语言,不需要开发人员手动释放内存,避免了因为忘记手动释放内存而导致软件长时间运行出现内存溢出的问题。

二、编译执行与解释执行

在简单了解了Java语言优势之后,我们再讨论一个问题,Java是解释执行还是编译执行?(这里简单了解下解释器和编译器的区别:解释器立即执行代码,编译器为稍后的执行准备好源代码

众所周知C语言是编译执行,通过编译器将源码编译为机器码,直接在特定的CPU上运行,所以如果操作系统、硬件发生了改变,需要重新编译源码才能运行。但是Java的编译有所不同,它是直接将源码编译成字节码,再由JVM内嵌的解释器将字节码转换为机器码。

所以从这个层面来看Java语言是解释执行的。但是,大多数的JVM都提供一个名为JIT(Just In Time)的编译器,也就是动态编译器,它的作用是在运行过程中将热点代码编译成机器码,提高运行效率,此时Java语言是编译执行的。有兴趣的朋友可以参考这篇文章《深入浅出JIT编译器》,后续我们也会进一步学习相关知识。

在这里结合HotSpot JVM的配置项来阐述下Java的编译过程。首先我们得知道在JDK8中,默认采用混合编译的方式,即Xmixed模式。HotSpot内部内置了两种JIT compiler,C1和C2,C1即client模式,适用于启动速度敏感的应用;C2即server模式,对应长时间运行的服务器应用。这里还涉及到分层编译TieredCompilation,后续我们会讲到。

但是编译策略需要经过大量的调用来制定,在server模式中是上万次,在client模式中是1500次。用户也可以通过参数指定JVM采用解释执行或者编译执行,“-Xint”只进行解释执行,“-Xcomp”不进行解释执行。此时你不要想当然觉得不进行解释执行的效率最高,因为在这种模式下很多JIT的优化策略效果不好

既然谈到了解释编译,就得提一下在JDK9中引入的AOT编译方式,直接将字节码编译成机器码,从而避免JIT预热等开销。使用jaotc工具把字节码.class文件或者模块编译成AOT库,启动java时指定AOT库即可。AOT不仅仅只有这一种实现方式,业界也存在其他第三方工具提供相关功能。

三、总结

通过上面的问题以及延伸,我们可以了解到JVM作为Java语言的重要基础,在用户并没有感知的情况下提高了程序的执行效率,那么Java语言能够今天的地位也多亏了JVM开发人员孜孜不倦的优化。那么作为一名Java开发人员如果要从“增删改查业务代码”中更进一步,也必须了解JVM是如何处理Java字节码,在后面的文章中也会一一介绍JVM类加载机制、垃圾回收机制原理等JVM相关知识。

最后总结一下,JVM是一个平台,不仅仅针对Java语言,所有合规的字节码都可以在JVM上运行,比如Scala、Jython等大量的JVM语言。

四、后记

回顾问题:
1、Java语言为什么可以跨平台?
2、解释执行和编译执行有什么区别?Java语言是解释执行还是编译执行?
3、AOT编译方式是指什么?

延伸:
1、Java是如何启动的?JVM是如何启动的?
2、JIT有什么作用?什么叫JIT预热?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。