基于JDK11的javaSE,带你走进全新的java世界概述

Posted 步尔斯特

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于JDK11的javaSE,带你走进全新的java世界概述相关的知识,希望对你有一定的参考价值。


对于一些老生常谈的问题,会一笔带过

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工具!

以上是关于基于JDK11的javaSE,带你走进全新的java世界概述的主要内容,如果未能解决你的问题,请参考以下文章

带你走进“华为链”

飞桨开源框架2.0,带你走进全新高层API,十行代码搞定深度学习模型开发

走进Spring——Spring框架概述

⭐NUMA架构进行优化,数据库效率显著提升,那么什么是NUMA?微动画带你走进全新NUMA⭐

Java基础教程带你走进java的世界

Java基础教程带你走进java的世界