JVM 虚拟机
- General
- jvm架构
- 2.1. 类装载流程
- 2.2. 安全性
- 2.2.1. 双亲委派机制
- 2.2.2. 沙箱机制
- 2.3. 栈
- 2.3.1. 方法栈
- 2.3.2. 本地方法栈
- 2.4. 堆 (重GC/fullGC;发生在新生区和年老区)
- 2.4.1. 新生代 (轻GC/minorGC)
- 2.4.1.1. Eden区
- 2.4.1.2. 存活区
- 2.4.2. 年老代 (MojorGC)
- 2.4.3. 元空间
- 2.4.1. 新生代 (轻GC/minorGC)
- 2.5. jvm调优
- 2.5.1. 调优基础知识
- 2.6. 内存溢出异常
- 垃圾收集
- 3.1. 垃圾判断方法
- 3.1.1. 引用计数法
- 3.1.2. 可达性分析
- 3.2. 垃圾回收算法
- 3.2.1. 复制算法
- 3.2.2. 标记清除法
- 3.2.3. 标记整理
- 3.3. 垃圾回收算法总结
1. General
- 双亲委派机制
- jvm体系结构
- 堆的组成
- 垃圾回收机制
- jvm调优
2. jvm架构
processon jvm架构图 https://www.processon.com/view/5ea7a1b9e401fd21c196eb17
2.1. 类装载流程
- 核心:加载 > 链接 > 初始化
2.2. 安全性
2.2.1. 双亲委派机制
- 引导类加载器 rt.jar
- 扩展类加载器 ext目录下
- 应用程序类加载器 classpath
- 自定义类加载器 extend classloader
2.2.2. 沙箱机制
- 字节码校验:确保java类文件准守java语言规范
- 类加载器:双亲委派机制 (虚拟机为不同的类加载器载入的类提供不同的命名空间,每个空间都是独立的)
- 存取控制器: 控制核心api对操作系统的存取权限
- 安全管理器: 是核心api和操作系统之间的主要接口
- 完全软件包: 包含安全提供者,消息摘要,数字签名,加密,鉴别
2.3. 栈
2.3.1. 方法栈
- 栈是由栈帧构成,每一个栈帧就可以看作一个函数
- 栈帧里主要包含里引用,8大基本类型,父栈引用,子栈引用
2.3.2. 本地方法栈
- 本地方法栈指native修饰的方法,它直接调用本地方法接口,接着调用本地方法库
2.4. 堆 (重GC/fullGC;发生在新生区和年老区)
年轻代:年老代 = 1:2
Eden : from: to = 8: 1: 1
2.4.1. 新生代 (轻GC/minorGC)
2.4.1.1. Eden区
- Eden区是创建对象最开始存放的区间 如:new Student()
2.4.1.2. 存活区
- 存活区有两个,一个0和1区
- 这两个区的大小比例=1:1
2.4.2. 年老代 (MojorGC)
2.4.3. 元空间
- 1.8以前都叫永久代,存放的java运行时的环境等等
- 存放的是方法区(方法区里有常量池)
2.5. jvm调优
jvm调优发生在堆中,只有堆中才存在垃圾
2.5.1. 调优基础知识
- 总分配的内存是电脑内存(Xmx) = 1:4 (默认)
- 初始化内存是电脑内存(Xms) = 1:64 (默认)
- OOM解决思路(尝试扩大堆大小,其次分析代码)或 (-Xms8m -Xmx8m -XX:+printGCDetails)
- 初始化堆 = 新生代 + 年老代 + (元空间?:逻辑上存在,物理上不存在,也叫非堆)
2.6. 内存溢出异常
- 线程请求的最大深度 > 虚拟机中所允许的最大深度 StackOverflowError(包含虚拟机栈,本地方法栈)
- 方法区和运行常量池溢出 java.lang.OutOfMemoryError: PermGen space
- Java堆溢出 java.lang.OutOfMemoryError: Java heap space
- 本机直接内存溢出 java.lang.OutOfMemoryError
3. 垃圾收集
3.1. 垃圾判断方法
3.1.1. 引用计数法
3.1.2. 可达性分析
3.2. 垃圾回收算法
3.2.1. 复制算法
- Eden区进过GC后,对象会移动到存活to区
- jvm复制算法主要指存活from区将对象移动复制到to区
- 经过15次GC都没有被回收的对象会进入到年老区
3.2.2. 标记清除法
- 循环每一块内存,对象在使用设个标志
- 循环每一块内存,清空没有使用的对象
3.2.3. 标记整理
- 循环每一块内存,对象在使用设个标志
- 循环每一块内存,清空没有使用的对象
- 将内存对象移动到一起,空的内存也整理到一起
3.3. 垃圾回收算法总结
时间复杂度:复制算法 > 标记清除法 > 标记整理
空间复杂度:标记清除法 = 标记整理 > 复制算法
垃圾回收目前是采用分代回收最合适,年轻代采用复制算法,年老代采用标记整理