Skip to content

JavaLearning

JDK 11 安装目录结构

^c7cb79

  • bin: 该路径下存放了 JDK 的各种工具命令, 常用的 javac / java 等命令就放在该路径下.
  • conf: 该路径下存放了 JDK 的相关配置文件.
  • include: 存放一些平台特定的头文件.
  • jmods: 该目录下存放了 JDK 的各种模块. JDK 9 之后新增.
  • legal: 该目录下包含了 JDK 各模块的授权文档.
  • lib: 该路径下存放的是 JDK 工具的一些补充 JAR 包. 比如 src.zip 文件中保存了 Java 的源代码.
  • README  和  COPYRIGHT  等说明性文档.

环境变量配置

  • Path: 定义 JDK 安装位置
  • CLASSPATH: 定义 .class 文件存放位置, 用于加载类库
    • 对于 1.4 及以前 JDK 版本, 需要手动指定为 .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar
    • 对于 1.5 及以后 JDK 版本, 隐式设置为 . . 显示设置时隐式设置失效, 需要手动设置当前目录
    • 对于 9 及以后 JDK 版本, 随 jmods 变化已移除 %JAVA_HOME%\lib\dt.jar%JAVA_HOME%\lib\tools.jar
    • 可在启动时通过启动参数 -classpath-cp 进行指定, 会覆盖环境变量配置

JDK 9 增加 REPL 工具 jshell

  • 可以直接在终端中使用 jshell 来打开此工具

JDK 11 GC

  • 2011 年 7 月发布的 Java 7 提供了 G1 垃圾回收器来代替原有的并行标记/清除垃圾回收器(简称 CMS). 并宣布在未来的日子里, G1 垃圾回收器将会逐渐取代原有的 CMS 垃圾回收器.
  • 2014 年 3 月发布的 Java 8 删除了 HotSpot JVM 中的永生代内存(PermGen, 永生代内存主要用于存储一些需要常驻内存, 通常不会被回收的信息), 而是改为使用本地内存来存储类的元数据信息, 并将之称为: 元空间(Metaspace), 这意味着以后不会再遇到 java.lang.OutOfMemoryError: PermGen 错误.
  • 2017 年 9 月发布的 Java 9 彻底删除了传统的 CMS 垃圾回收器, 因此运行 JVM 的 DefNew+CMS / ParNew+SerialOld / Incremental CMS 等组合全部失效. Java 命令(该命令负责启用 JVM 运行 Java 程序)以前支持的以下 GC 相关选项全部被删除.
    • -Xincgc
    • -XX:+CMSIncrementalMode
    • -XX:+UseCMSCompactAtFullCollection
    • -XX:+CMSFullGCsBeforeCompaction
    • -XX:+UseCMSCollectionPassing
    • 此外, -XX:+UseParNewGC 选项也被标记为过时, 将来也会被删除.
  • 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:+UseZGC
    • 11 中 ZGC 垃圾回收器只能在 64 位的 Linux 平台上使用.
  • 此外, Java 11 还引入了实验性的 Epsilon 垃圾回收器. 严格来说, Epsilon 并不算真正的垃圾回收器, 它只负责内存分配, 并不负责内存回收. 因此, 这个垃圾回收器主要在性能测试中比较有用, 用于与其他垃圾回收器的开销/收益比进行对比.

JavaDoc

  • 常用注解

    • @author: 指定 Java 程序的作者
    • @version: 指定源文件的版本
    • @deprecated: 不推荐使用的方法
    • @param: 方法的参数说明信息
    • @return: 方法的返回值说明信息
    • @see: "参见", 用于指定交叉参考的内容
    • @exception: 抛出异常的类型
    • @throws: 抛出的异常,和@exception同义
  • 创建 package 说明文件

    • 在包中包含 package.html 文件
  • 创建 javadoc 文档

    shell
    javadoc [--options] file | package

浮点数

  • 特殊的浮点数

    java
    // NaN
    System.out.println(Double.NaN);
    System.out.println(0/0.0);
    
    // Infinity
    System.out.println(Double.POSITIVE_INFINITY);
    System.out.println(1/0.0);
    
    // -Infinity
    System.out.println(Double.NEGATIVE_INFINITY);
    System.out.println(-1/0.0);
    
    // Exception in thread "main" java.lang.ArithmeticException: / by zero
    System.out.println(1/0);

变量声明

  • Java 10 开始支持使用 var 定义局部变量

switch

  • switch 语句的表达式只能是 byte / short / int / char / string(Java7+) / Enum 几种类型