一、什么是JDK
JDK(Java Development Kit)即 Java 开发工具包,是 Java 编程的基础与核心,由 Sun Microsystems(现归属于 Oracle 公司 )开发,主要作用如下:
1、提供编译环境
它包含了javac
这一编译器,能把 Java 程序员写好的以.java
为后缀的源文件,编译成 Java 虚拟机(JVM)可识别并执行的字节码文件(.class
) 。例如,开发一个简单的 “Hello World” 程序,编写完HelloWorld.java
源码后,就需借助javac
将其转换为字节码。
2、配备运行环境
JDK 整合了 Java 运行时的基础环境 JRE(Java Runtime Environment),JRE 里有 Java 虚拟机、Java 核心类库等,这保障了编译好的 Java 程序能顺利运行起来,无论该程序是一个桌面应用、Web 应用,还是移动端的安卓应用底层部分。
3、开发工具
JDK 还带有一系列实用开发工具,像是java
命令,用于执行字节码文件;jar
工具,可将相关的类文件打包成一个.jar
归档文件,方便程序分发与复用;javadoc
能依据 Java 代码里的注释,自动生成规范的 API 文档 。
4、丰富类库支持
JDK 内置海量的类库,这些类覆盖了从基础数据结构操作、文件读写、网络通信,到图形界面绘制、数据库连接等多方面的功能,程序员开发时只需引入对应的类,调用相关方法,就能快速搭建起应用的各项功能,极大减少了开发成本与周期。
二、JVM的内存结构
1、 程序计数器
(1)作用
它是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。在多线程环境下,由于线程会频繁切换,程序计数器用于记录每个线程当前执行到的位置,以便线程切换回来时能精准恢复执行。
(2)特点
线程私有的内存区域,生命周期与线程相同。此区域不会发生内存溢出(OutOfMemoryError ,简称 OOM)情况。
2、虚拟机栈
(1)作用
用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每当一个方法被调用时,就会在虚拟机栈中创建一个对应的栈帧,方法执行完毕,栈帧出栈。
(2)特点
也是线程私有的,它的大小可以通过参数-Xss
来设定。如果线程请求的栈深度大于虚拟机所允许的深度,就会抛出StackOverflowError
;若虚拟机栈无法申请到足够内存来扩展,会抛出OutOfMemoryError
。
3、本地方法栈
(1)作用
与虚拟机栈类似,不过它是为虚拟机使用到的 Native 方法服务,也就是那些用非 Java 语言(如 C、C++ )编写并通过 JNI(Java Native Interface)调用的方法。
(2)特点
线程私有的内存区域,同样可能出现StackOverflowError
和OutOfMemoryError
异常。
4、堆
(1)作用
堆是 JVM 所管理的最大的一块内存区域,几乎所有的对象实例和数组都在堆上分配内存。这也是 Java 垃圾回收器(GC)重点关注和管理的区域。
(2)特点
它是线程共享的,堆的大小可以通过参数-Xmx
(最大堆容量)和-Xms
(初始堆容量)来调整。由于对象不断创建,当堆内存无法满足新对象的分配需求时,就会抛出OutOfMemoryError
。
5、方法区
(1)作用
用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
(2)特点
它是线程共享的,在 Java 8 之前,方法区由永久代(PermGen)实现,容易出现内存溢出;Java 8 之后,使用元空间(Metaspace)替代了永久代,元空间直接使用本地内存,理论上受限于本地机器的内存大小,减少了因永久代设置不当引发的 OOM 风险。
三、JDK8的新特性
1、Lambda表达式,允许把函数当作参数传递进方法,替代传统匿名内部类的复杂语法。
2、Stream API,提供了一种声明式处理集合数据的方式,代码简洁且高效。能对集合进行过滤、映射、排序、归并等操作。
3、接口的默认方法,打破传统接口只能有抽象方法的限制,接口可以有默认实现的方法。当接口升级添加新方法时,已实现该接口的类无需全部修改,只要新方法定义成默认方法就行。
4、静态接口方法,直接属于接口,不能被实现类重写,为接口提供了更多工具性的功能整合。
5、新的日期和时间API,摒弃了Date
和Calendar
类,他们式线程不安全的。新引入LocalDate
(表示日期)、LocalTime
(表示时间)、LocalDateTime
(表示日期时间)等类,使用起来更加直观、便捷。
6、Optionnal 类,用来解决空指针问题,它包装一个对象,通过一系列方法判断对象是否存在,存在则获取值,不存在则优雅返回默认值,避免了繁琐的if - null
判断。
7、Base64编码的支持,提供了便捷的 Base64 编码与解码工具,可用于处理文本、二进制数据的编码转换,有标准、URL 安全、MIME 兼容等多种编码模式。
四、java垃圾回收(GC)机制
1、引用技术法
就是给每个对象添加一个引用计数器,每当有一个新的引用指向该对象时,计数器加 1,当引用断开时,计数器减 1,一旦计数器归零,就意味着该对象没有任何引用,可以标记为垃圾;不过 Java 虚拟机并没有采用这种算法,因为它难以解决对象间循环引用的问题。
2、可达性分析
以根对象为起始点,沿着对象之间的引用关系,层层遍历,构建出一个引用关系图。所有能从根对象通过引用链触达的对象,都被判定为存活对象,会被标记下来;而那些无法通过引用链关联到根对象的对象,就会被认定是可回收的垃圾对象。例如,在一个简单的 Java 类实例关系中,若类 A 的对象 a 被某个根对象引用,类 A 里有个成员变量指向类 B 的对象 b,那么对象 a 和 b 通过这条引用链都属于可达对象;反之,若某个对象切断了和所有根对象的引用关系,即使它内部还有自身循环引用,依然会被标记成垃圾。