【JVM】关于JVM,你需要掌握这些 | 一文彻底吃透JVM系列
作者:互联网
【JVM】关于JVM,你需要掌握这些 | 一文彻底吃透JVM系列
JDK 是什么?
JDK 是用于支持 Java 程序开发的最小环境。
Java 程序设计语言
Java 虚拟机
Java API类库
JRE 是什么?
JRE 是支持 Java 程序运行的标准环境。
Java SE API 子集
Java 虚拟机
Java历史版本的特性?
Java Version SE 5.0
引入泛型;
增强循环,可以使用迭代方式;
自动装箱与自动拆箱;
类型安全的枚举;
可变参数;
静态引入;
元数据(注解);
引入Instrumentation。
Java Version SE 6
支持脚本语言;
引入JDBC 4.0 API;
引入Java Compiler API;
可插拔注解;
增加对Native PKI(Public Key Infrastructure)、Java GSS(Generic Security Service)、Kerberos和LDAP(Lightweight Directory Access Protocol)的支持;
继承Web Services;
做了很多优化。
Java Version SE 7
switch语句块中允许以字符串作为分支条件;
在创建泛型对象时应用类型推断;
在一个语句块中捕获多种异常;
支持动态语言;
支持try-with-resources;
引入Java NIO.2开发包;
数值类型可以用2进制字符串表示,并且可以在字符串表示中添加下划线;
钻石型语法;
null值的自动处理。
Java 8
函数式接口
Lambda表达式
Stream API
接口的增强
时间日期增强API
重复注解与类型注解
默认方法与静态方法
Optional 容器类
运行时数据区域包括哪些?
程序计数器
Java 虚拟机栈
本地方法栈
Java 堆
方法区
运行时常量池
直接内存
程序计数器(线程私有)
程序计数器(Program Counter Register)是一块较小的内存空间,可以看作是当前线程所执行字节码的行号指示器。分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器完成。
由于 Java 虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式实现的。为了线程切换后能恢复到正确的执行位置,每条线程都需要一个独立的程序计数器,各线程之间的计数器互不影响,独立存储。
如果线程正在执行的是一个 Java 方法,计数器记录的是正在执行的虚拟机字节码指令的地址;
如果正在执行的是 Native 方法,这个计数器的值为空。
程序计数器是唯一一个没有规定任何 OutOfMemoryError 的区域。
Java 虚拟机栈(线程私有)
Java 虚拟机栈(Java Virtual Machine Stacks)是线程私有的,生命周期与线程相同。
虚拟机栈描述的是 Java 方法执行的内存模型:每个方法被执行的时候都会创建一个栈帧(Stack Frame),存储
局部变量表
操作栈
动态链接
方法出口
每一个方法被调用到执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。
JDK 是什么?
JDK 是用于支持 Java 程序开发的最小环境。
Java 程序设计语言
Java 虚拟机
Java API类库
JRE 是什么?
JRE 是支持 Java 程序运行的标准环境。
Java SE API 子集
Java 虚拟机
Java历史版本的特性?
Java Version SE 5.0
引入泛型;
增强循环,可以使用迭代方式;
自动装箱与自动拆箱;
类型安全的枚举;
可变参数;
静态引入;
元数据(注解);
引入Instrumentation。
Java Version SE 6
支持脚本语言;
引入JDBC 4.0 API;
引入Java Compiler API;
可插拔注解;
增加对Native PKI(Public Key Infrastructure)、Java GSS(Generic Security Service)、Kerberos和LDAP(Lightweight Directory Access Protocol)的支持;
继承Web Services;
做了很多优化。
Java Version SE 7
switch语句块中允许以字符串作为分支条件;
在创建泛型对象时应用类型推断;
在一个语句块中捕获多种异常;
支持动态语言;
支持try-with-resources;
引入Java NIO.2开发包;
数值类型可以用2进制字符串表示,并且可以在字符串表示中添加下划线;
钻石型语法;
null值的自动处理。
Java 8
函数式接口
Lambda表达式
Stream API
接口的增强
时间日期增强API
重复注解与类型注解
默认方法与静态方法
Optional 容器类
运行时数据区域包括哪些?
程序计数器
Java 虚拟机栈
本地方法栈
Java 堆
方法区
运行时常量池
直接内存
程序计数器(线程私有)
程序计数器(Program Counter Register)是一块较小的内存空间,可以看作是当前线程所执行字节码的行号指示器。分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器完成。
由于 Java 虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式实现的。为了线程切换后能恢复到正确的执行位置,每条线程都需要一个独立的程序计数器,各线程之间的计数器互不影响,独立存储。
如果线程正在执行的是一个 Java 方法,计数器记录的是正在执行的虚拟机字节码指令的地址;
如果正在执行的是 Native 方法,这个计数器的值为空。
程序计数器是唯一一个没有规定任何 OutOfMemoryError 的区域。
Java 虚拟机栈(线程私有)
Java 虚拟机栈(Java Virtual Machine Stacks)是线程私有的,生命周期与线程相同。
虚拟机栈描述的是 Java 方法执行的内存模型:每个方法被执行的时候都会创建一个栈帧(Stack Frame),存储
局部变量表
操作栈
动态链接
方法出口
每一个方法被调用到执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。