概述
- 发展简史
- 运行机制
- 安装配置
- 编译程序
- 交互式工具:jshell
- java 11 改进的垃圾回收器
- 对于IDE
对于一些老生常谈的问题,会一笔带过
Java11是Java8之后第一个长期支持版,因此建议广大开发者逐步过渡到Java11
发展简史
Sun在1996年初发布了JDK1.0,这个版本包括两部分:JRE和JDK。
JRE:核心API、集成API、用户界面API、发布技术、Java虚拟机。
JDK:编译Java程序的编译器(javac命令)
2002年2月,Sun发布了JDK历史上最为成熟的版本:JDK1.4 。此时由于Compaq、Fujitsu、SAS、Symbian、IBM等公司的参与,是JDK1.4成为发展最快的一个JDK版本。
2004年10月,Sun发布了JDk1.5,同时,Sun将JDk1.5改名JavaSE5.0。JDK1.5增加了诸如泛型、增强的for语句,可变数量的形参、注释(Annotations)、自动拆装箱等。
2009年4月20日,Oracle宣布将以每股9.5美元的价格收购Sun,该交易的总价值约为74亿美元,而Oracle公司通过收购Sun公司获得了两项软件的资产:Java和Solaris。
2011年7月28日,Oracle发布JavaSE 7,引入了二进制整数、支持字符串的switch语句、菱形语法、多异常捕捉、自动关闭资源的try语句等新特性。
2014年3月18日,Oracle公司发布了JavaSE 8,这次版本升级带来了全新的lambda表达式、流式编程等大量新特性。
2017年9月22日,Oracle公司发布JavaSE 9,这次版本的升级强化了Java的模块化系统,让庞大的Java语言更轻量化,而且采用更高效、更智能的G1垃圾回收器,并在核心类库上进行了大量的更新,可以进一步简化编程。
运行机制
Java程序需要经过先编译,后解释两个步骤
Java语言既是编译型语言,也是解释型语言。或者说,Java语言既不是纯粹的编译型原因呢,也不是纯粹的解释型语言。
Java语言里负责解释执行字节码文件的是Java虚拟机,即JVM(Java Virtual Machine),JVM是可运行Java字节码文件的虚拟计算机。
相同的字节码程序需要在不同的平台上运行,这几乎是不可能的,只有通过中间的转换器才可以实现,JVM就是这个转换器。
所有平台上的JVM向上提供给Java字节码程序的接口完全相同,但向下适应不同的平台的接口则互不相同。
Oracle公司制定的Java虚拟机规范在技术上规定了JVM的统一标准,具体定义了JVM的如下细节:
- 指令集
- 寄存器
- 类文件的格式
- 栈
- 垃圾回收堆
- 存储区
Oracle公司制定这些规范的目的是为了提供统一的标准,最终实现Java程序的平台无关性。
安装配置
官网自行下载对应的版本即可
Windows操作系统不区分大小写,设置Path和PATH并没有区别;而Linux系统是区分大小写的,设置Path和PATH是有区别的。
在Linux上设置环境变量
编译程序
javac -d destdir srcFile
-d destdir:用以指定编译生成的字节码文件的存放路径,destdir只需是本地磁盘上的一个有效路径即可
srcFile :是Java源文件所在的位置,可以是绝对路径或者是相对路径
放在当前的路径下可以写为:
javac -d . HelloWord.java
-d是可以省略的,省略不写会默认将文件存放在当前目录下
只有使用早期的版本才需要设置CLASSPATH变量,其作用就是当使用”java Java类名“命令来运行Java程序时,JRE去哪里搜索Java类呢?可能会有人回答,在当前路径下搜索啊,这个回答很聪明,但是1.4以前版本的JDK都没有这个功能。
最简单的java程序:
class Test{}
交互式工具:jshell
从JDK 9 开始,JDK内置了一个强大的交互工具:jshell,它是一个REPL(Read-Eval-Print Loop)工具,该工具是一个交互式的命令行界面,可用于执行java语言的变量声明、语句和表达式,而且可以立即看到结果,我们可以使用该工具快速学习Java或测试Java的新API。
jshell位于JDK安装目录的bin路径下,如果正确的配置PATH环境变量,输入jshell就可以进入jshell模式。
使用教程1
使用教程2
java 11 改进的垃圾回收器
内存泄漏:如果分配出去的内存得不到及时回收,就会引起系统运行速度下降,甚至会导致程序瘫痪,这种现象被称为内存泄漏。
Java程序的内存分配和回收都是由JRE在后台自动进行的,JRE会负责回收那些不再使用的内存,这种机制被称为垃圾回收。
在Java中,当没有引用变量指向原先分配给某个对象的内存时,该内存便成为垃圾,JVM的一个超级线程会自动释放该内存区。
垃圾回收机制保护程序的完整性,垃圾回收是java语言安全性策略的一个重要部分
Java语言没有明确的说明JVM使用哪种垃圾回收算法,但是任何一种垃圾回收算法一般要做两件事:发现无用的对象;回收被无用对象占用的内存空间,使该空间可被程序再次使用。
垃圾回收特点:
- 垃圾回收器的工作目标是回收无用对象的内存空间,这些内存空间都是JVM堆内存里的内存空间,垃圾回收器只能回收内存资源,对其他物理资源,如数据库连接、磁盘IO、等资源则无能为力
- 为了更快的让垃圾回收器回收哪些不再使用的对象,可以将该对象的引用变量设置为null,通过这种方式暗示垃圾回收器可以回收该对象。
- 垃圾回收发生的不可预知性。可调用Runtime对象的gc()或System.gc()等方法来建议系统进行垃圾回收,但这种调用仅仅是建议,依然不能精确控制垃圾回收机制的执行。
- 垃圾回收的精确性主要包括两个方面:一是垃圾回收机制能够精确的标记活着的对象;二是垃圾回收器能够精确的定位对象之间的引用关系。
- 现在的JVM有多种不同的垃圾回收实现
2011年7月发布的Java 7 提供了G1垃圾回收器来代替原有的并行标记/清除垃圾回收器(简称CMS)。并宣布在未来的日子里逐渐取代原有的CMS垃圾回收器。
2014年3月发布的Java 8 删除了HotSpot JVM中的永生代内存,而是改为使用本地内存来存储类的元数据信息,并将其称为元空间,这意味着以后不会再遇到java.lang.OutOfMemoryError:PermGen错误。
2017年9月发布的Java 9 彻底删除了传统的CMS垃圾回收器,因此运行JVM的一些组合全部失效。Java命令以前支持的GC相关选项全部被删除。
Java 9 默认采用低暂停(low-pause)的G1垃圾回收器,并为G1垃圾回收器自动确定了几个重要的参数设置,从而保证G1垃圾回收器的可用性、确定性和性能。如果部署项目时为java命令指定了-XX:+UseConcMarkSweepGC选项希望启用CMS垃圾回收器,系统会显示警告信息。
Java 11 则再次引入了新的、实验性的Z垃圾回收器(简称ZGC),这个垃圾回收器具有以下优点:
- 垃圾回收时暂停时间不会超过10ms
- 暂停时间不会随着堆或实时集合的大小而增加
- 可处理几百MB到几TB的堆内存
ZGC的核心时并发垃圾回收器,这意味着它可在Java线程继续执行时,完成所有繁重工作(如标记、压缩、引用处理、表清理等),从而大大降低了该垃圾回收器对程序响应速度的影响。
ZGC还在Java 11 中还处于实验性阶段(在未来可能会取代G1垃圾回收器),因此Java默认并未启用ZGC垃圾回收器,如果希望运行Java程序时启用ZGC垃圾回收器,则可在运行java命令时使用如下选项:
- -XX:+UnlockExperimentalVMOptions
- -XX:+UserZGC
此外,Java 11 还引入了实验性的Epsilon垃圾回收器。严格来说,Epsilon并不算真正的垃圾回收器,它只负责内存分配,并不负责内存回收,因此,这个垃圾回收器主要在性能测试中比较有用,用于与其他垃圾回收器的开销/收益比进行对比。
对于IDE
除大家所知道的Eclipse和IntelliJ IDEA之外,还有NetBeans、IBM提供的WSAD、Oracle提供的JDeveloper等。
如果你还离不开这个IDE工具,那么你就不能使用这个IDE工具,只有当你十分清楚在IDE工具里单击每一个菜单,单击每一个按钮…IDE工具在底层为你做的每一个细节时,才可以使用IDE工具!