写在前面
最近 , 一直有小伙伴让我整理下关于JVM的知识 , 经过十几天的收集与整理 , 初版算是整理出来了 。希望对大家有所帮助 。JDK 是什么?JDK 是用于支持 Java 程序开发的最小环境 。
- Java 程序设计语言
- Java 虚拟机
- Java API类库
- Java SE API 子集
- Java 虚拟机
- 引入泛型;
- 增强循环 , 可以使用迭代方式;
- 自动装箱与自动拆箱;
- 类型安全的枚举;
- 可变参数;
- 静态引入;
- 元数据(注解);
- 引入Instrumentation 。
- 支持脚本语言;
- 引入JDBC 4.0 API;
- 引入Java Compiler API;
- 可插拔注解;
- 增加对Native PKI(Public Key Infrastructure)、Java GSS(Generic SecurityService)、Kerberos和LDAP(Lightweight Directory Access Protocol)的支持;
- 继承Web Services;
- 做了很多优化 。
- switch语句块中允许以字符串作为分支条件;
- 在创建泛型对象时应用类型推断;
- 在一个语句块中捕获多种异常;
- 支持动态语言;
- 支持try-with-resources;
- 引入Java NIO.2开发包;
- 数值类型可以用2进制字符串表示 , 并且可以在字符串表示中添加下划线;
- 钻石型语法;
- null值的自动处理 。
- 函数式接口
- Lambda表达式
- Stream API
- 接口的增强
- 时间日期增强API
- 重复注解与类型注解
- 默认方法与静态方法
- Optional 容器类
- 程序计数器
- Java 虚拟机栈
- 本地方法栈
- Java 堆
- 方法区
- 运行时常量池
- 直接内存
由于 Java 虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式实现的 。为了线程切换后能恢复到正确的执行位置 , 每条线程都需要一个独立的程序计数器 , 各线程之间的计数器互不影响 , 独立存储 。
- 如果线程正在执行的是一个 Java 方法 , 计数器记录的是正在执行的虚拟机字节码指令的地址;
- 如果正在执行的是 Native 方法 , 这个计数器的值为空 。
Java 虚拟机栈(线程私有)Java 虚拟机栈(Java Virtual Machine Stacks)是线程私有的 , 生命周期与线程相同 。虚拟机栈描述的是 Java 方法执行的内存模型:每个方法被执行的时候都会创建一个栈帧(Stack Frame) , 存储
- 局部变量表
- 操作栈
- 动态链接
- 方法出口
这个区域有两种异常情况:
- StackOverflowError:线程请求的栈深度大于虚拟机所允许的深度
- OutOfMemoryError:虚拟机栈扩展到无法申请足够的内存时
本地方法栈(Native Method Stacks)为虚拟机使用到的 Native 方法服务 。
Java 堆(线程共享)Java 堆(Java Heap)是 Java 虚拟机中内存最大的一块 。Java 堆在虚拟机启动时创建 , 被所有线程共享 。
经验总结扩展阅读
- 2023年9月15日适合入宅吗 2023年9月15日入宅黄道吉日
- 2023年农历八月初一宜祭祖吗 2023年9月15日祭祖黄道吉日
- JVM学习笔记——垃圾回收篇
- 2023年1月27日取蜂蜜行吗 2023年1月27日适合取蜂蜜吗
- 2023年农历正月初六安装房门吉日 2023年1月27日是安装房门的黄道吉日吗
- 2023年1月27日举办成人仪式行吗 2023年1月27日举办成人仪式吉日一览表
- 银手镯变黑是生病了吗?
- 九州缥缈录铁皇结局是什么?
- 向前是什么电视剧的男主角?
- 长脸型适合什么样的眼镜?