首页 > 编程知识 正文

java核心技术卷I,java核心技术卷一豆瓣

时间:2023-05-05 11:21:48 阅读:225722 作者:1068


专题 | 谈谈对Java平台的理解

2019年4月24日下午    沉晓
`学Java已经快两个月了,结果被问到 "你能给我解释一下什么是Java平台吗?"
结果支支吾吾地说了一大堆,却毫无逻辑可言,感觉超级失败
我觉得很有必要重新谈谈我对Java平台的认识,帮我理清逻辑的同时,希望能够帮助你.

Java平台如何理解

Java平台的体系包括了以下几个重要组成部分:

Java程序设计语言Class文件格式各种硬件平台上的Java虚拟机Java API类库及相关工具来自商业机构和开源社区第三方Java类库

就Java平台而言, Java是一种面向对象的语言,它拥有两个显著的特性:

跨平台,号称 一次编写,随处运行垃圾收集(GC, Garbage Collection),Java 通过垃圾收集器(Garbage Collector)回收分配内存,
大部分情况下,程序员不需要自己操心内存的分配和回收。

说到跨平台, 就需要引入Java的从源代码到执行的过程存在的机制了:
Java源程序首先要通过编译,翻译成字节码文件(.class文件), 字节码文件再通过Java的虚拟机的解释器和JIT(即时编译器),翻译成二进制交给CPU进行执行.

主流版本 JDK8

所有的程序,最终都要回归二进制,由CPU进行执行, 跨平台的关键就在于编译之后,:
首先讲一下虚拟机(JVM), JVM有针对各个操作系统对应的版本, 能够调用相应操作系统的API, 对于这种"中间件",需要建立一套标准,这套标准的语言规范就是字节码语言规范.

你可能会迷惑,我这里说明一下, Java程序语言规范不同于字节码语言规范, Java诞生早期,它们在语法上类似,功能上类似.
随着Java的发展, Java需要引入了很多特性,但是作为JVM支持的字节码语言规范不能够轻易变更, 就需要在Java程序语言规范和编译器上加一些东西,使JVM能够支持, 比如说泛型和内部类, JVM是不认这个的, 只是编译器动了一些手脚,让JVM能够去支持,如果想进一步了解,可以看我的专栏 <Java核心技术 卷1>

Java编译器编译Java后翻译成字节码文件,而不是二进制,使得Java具备了跨平台的能力.
说到这里,想多点关于JVM将字节码文件翻译成二进制的过程,
JVM采用 解释和编译混合的一种模式,即所谓的混合模式(-Xmixed)。
通常运行在 server 模式的 JVM,会进行上万次调用以收集足够的信息进行高效的编译,client 模式这个门限是 1500 次。
Java发展那么多年,经过统计研究表明, "绝大多数应用程序,都表现为: 小部分的代码,耗费了大多数的资源", 基于这种分析,有些方法和代码块是高频率调用的,也就是所谓的热点代码,所以通过即时编译器,提前将这类字节码直接编译成本地机器码。这样类似于缓存技术,运行时再遇到这类代码直接可以执行,而不是先解释后执行,这也是Java速度为什么提高如此之快的原因了.但是千万别认为,编译后,再去执行速度就会很快, “-Xcomp”会导致 JVM 启动变慢非常多,同时有些 JIT 编译器优化方式,比如分支预测,如果不进行 profiling,往往并不能进行有效优化。

解释: server是服务器端 client是客户端

Oracle Hotspot JVM 内置了两个不同的 JIT compiler,C1 对应前面说的 client 模式,适用于对于启动速度敏感的应用,比如普通 Java 桌面应用;C2 对应 server 模式,它的优化是为长时间运行的服务器端应用设计的。默认是采用所谓的分层编译(TieredCompilation)。关于分层编译的内容,以后会写到.
Oracle JDK9 支持分层编译和 AOT 协作使用, 其中AOT(Aheadof-Time Compilation),直接将字节码编译成机器代码,这样就避免了 JIT 预热等各方面的开销,因为我个人对这个也不太了解,可以参考http://openjdk.java.net/jeps/295。

在这里突然想穿插一些内容:
Python的热度近年来持续升高, 加之go语言和Node.js的发展,多少撼动了Java后端的地位.
但是未来的主流是混合编程, 现在Python是通过解释器执行的, 但是Python通过某种改变可以在Jython(虚拟机)上面运行,这也是Java虚拟机带动发展的结果. 如果走到了混合编程的那一天,在不同的场景选择合适的语言, 带来的好处将超乎人们的想象.

对于垃圾回收机制, 今后,我会开一个专栏<深入理解Java虚拟机>,你或许听过这本书,我会在这个专栏里,记载我的感悟. 还有 Java API类库及相关工具 和 来自商业机构和开源社区第三方Java类库, 这个就需要项目经验了, 靠时间博得的东西拉不开差距, 拉得开差距的地方在于对Java核心技术的掌握, 无非就是你付出了多少时间 ,你忍受了多少寂寞, 耐住性子深入学习了多久.

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。