文章的由来
从大学学习到使用Java开发时间快超过三年,发现自己的系统化学习还是缺乏很多知识点,在此重新系统化的整理一下自己对Java学习的一些理解, 我相信走得更远不仅仅有聪明人,还有不聪明但是认真并努力的人。
对Java的理解
Java是一种跨平台的,面向对象的,自动化程度高的编程语言。
为什么这样说呢?因为Java的特性有俩,其中一个是一次编译,到处运行
,此处充分表达了Java的跨平台特性,Java的虚拟机(JVM)在win、linux都有相同效果的不同实现,为Java成为跨平台语言提供了强大的支持。Java程序的成功运行过程可以分为四步:编码->编译->运行->调试,编码的过程自然不用赘叙,编译
指的是将.java文件编译成为.class文件,.class文件就是可以在各个平台运行的文件,在不同的平台中,.class被转化为不同的机器码(机器码指的是计算机的运行指令),但是实现的是相同的功能。
另外一个特性是Java有着日渐成熟的垃圾收集,分配、释放内存的处理机制
(gc->Garbage Collection),垃圾收集功能由JVM提供响应的垃圾收集器,大部分情况下,我们不需要去过多的关注内存的分配与回收。
对Java是解释执行
的理解
Java不完全是解释执行的。
1、Java源代码经过Javac编译成.class文件
2、.class文件会被JVM解析或者编译运行
解析:.class文件经过JVM自带的解析器解析执行,此时是解释执行。
编译:存在 即时编译器(JIT-> just in time compile)将热代码(经常运行的代码)编译成为该平台的机器码,并且可以分层进行相关优化,来提高代码的执行效率,此时是编译执行。
在Java9中,存在AOT编译器,将所有的代码直接编译成机器码执行。栗子:ART Android Runtime
JIT和AOT的不同:JIT占用内存稍大,但是可以分层次对进行优化,但是相对启动速度稍慢,并且需要一定时间和调用频率来触发JIT的分层优化机制。AOT 占用内存少低,启动速度更快,但是没有运行时的性能加成,没法根据实际请求情况进行优化。
简单来说:
- 程序直接指向字节码就是解释执行。
- 程序在运行时将高频使用的字节码动态编译成机器码就是JIT。
- 程序直接全部翻译为机器码就是AOT。
对于Java平台的理解
Java平台是Java代码从编写到运行的一系列过程,它分为以下几个步骤
1、开发
按照Java平台的语法规范,使用各种类库和框架开发程序。
2、编译
代码实现后使用Javac工具将程序编译成.class文件
3、加载
使用classloader类加载编译成功.class文件到JVM中
4、运行
在运行时,JVM使用JIT将.class文件中的二进制字节码解释或编译(根据使用频率来判断使用解释或者编译)成机器码执行
5、内存回收
Java程序运行期间,通过JVM的垃圾回收,根据参数使用不同的回收方法,将不再使用的内存地址中的数据进行清空
6、性能监控、性能调优
自动化的运行方式可能会存在着各种各样的问题,在必要的情况下我们需要通过各种工具实现对程序进行运行时的状态监控,进行程序的诊断和调休工作。
JDK和JRE的区别
- JRE为Java运行项目的运行提供基础支持。
- JDK为编写JAVA程序提供基础支持以及其他的一些能力,它包括JRE和其他的工具包。
总结
Java本身是一种语言,Java语言强大的特性来源于强大解释编译器-JVM。随着时代的发展,Java也在不断的进步当中,从JDK1.1到现在的JDK14,Java从传统的解释型语言特性,通过JIT、AOT也具有了编译型语言的特性。从面向对象编程到函数式编程,从命令式编程到响应式编程,Java在不停的进步,不停的强大自身,让更多的开发者开发程序更加便利与运行程序更加高效。
岁月的车轮滚滚而来,我们也不能停下我们学习的脚步,愿未来更加美好。