JVM 虚拟机

JVM 虚拟机

    1. General
    1. 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.5. jvm调优
      • 2.5.1. 调优基础知识
    • 2.6. 内存溢出异常
    1. 垃圾收集
    • 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. 双亲委派机制

类加载器

  1. 引导类加载器 rt.jar
  2. 扩展类加载器 ext目录下
  3. 应用程序类加载器 classpath
  4. 自定义类加载器 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. 调优基础知识

  1. 总分配的内存是电脑内存(Xmx) = 1:4 (默认)
  2. 初始化内存是电脑内存(Xms) = 1:64 (默认)
  3. OOM解决思路(尝试扩大堆大小,其次分析代码)或 (-Xms8m -Xmx8m -XX:+printGCDetails)
  4. 初始化堆 = 新生代 + 年老代 + (元空间?:逻辑上存在,物理上不存在,也叫非堆)

2.6. 内存溢出异常

  1. 线程请求的最大深度 > 虚拟机中所允许的最大深度 StackOverflowError(包含虚拟机栈,本地方法栈)
  2. 方法区和运行常量池溢出 java.lang.OutOfMemoryError: PermGen space
  3. Java堆溢出 java.lang.OutOfMemoryError: Java heap space
  4. 本机直接内存溢出 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. 标记清除法

  1. 循环每一块内存,对象在使用设个标志
  2. 循环每一块内存,清空没有使用的对象

3.2.3. 标记整理

  1. 循环每一块内存,对象在使用设个标志
  2. 循环每一块内存,清空没有使用的对象
  3. 将内存对象移动到一起,空的内存也整理到一起

3.3. 垃圾回收算法总结

时间复杂度:复制算法 > 标记清除法 > 标记整理
空间复杂度:标记清除法 = 标记整理 > 复制算法

垃圾回收目前是采用分代回收最合适,年轻代采用复制算法,年老代采用标记整理