JVM核心考点整理
分类:
文章
•
2024-03-11 10:30:25
1 JVM运行机制
JVM运行机制
- 类加载机制: 类加载过程由类加载器来完成,即由ClassLoader及其子类实现,有隐式加载和显示加载两种方式。隐式加载是指在使用new等方式创建对象时会隐式调用类加载器把对应的类加载到JVM中;显示加载是指通过直接调用Class.forName()把对应的类加载到JVM中。
- 内存模型(运行时数据区):共享区【方法区(栈)、堆、虚拟机栈】、私有区【本地方法栈、程序计数器】、直接内存(不受JVM GC管理)。其中程序计数器是唯一不会出现OOM的内存区。
- 执行引擎:即时编译器、垃圾收集器(按代回收算法:新生代-复制算法(MinorGC),老年代-标记整理算法(MajorGC))
2 内存区域
内存模型
- 方法区(栈/永久代) :用于存储被JVM加载的类信息、常量、静态变量、即时编译后的代码;HotSpot VM把GC分代收集扩展至方法区,使用堆的永久代实现方法区(永久代的内存回收主要针对常量池的回收和类的卸载)
- 堆:分为新生代(Eden区:from Survivor:to Survivor=8:1:1)、老年代。新生代占堆内存1/3,由Minior GC回收;老年代占堆内存(2/3)由Major GC回收。
- 虚拟机栈:每个方法在执行的同时都会创建一个栈帧(Stack Frame)【局部变量表、操作数栈、动态链接、方法出口】。栈帧随着方法的调用而创建,随着方法的结束而销毁,因此不需要GC。
- 本地方法栈:虚拟机栈为Java方法服务,本地方法栈为native方法服务
- 程序计数器:当前线程所执行的字节码的行号指示器(唯一没有OOM的区域)
3 垃圾回收算法
- 引用计数法:引用和对象相关联,对象的引用数为0即可回收
- 可达性分析:通过一系列的“GC roots”对象作为起点搜索,2次被标记为不可达对象,即可回收
- 复制算法:将内存分为大小相等的两块,每次只使用其中一块,垃圾回收时,将存活的对象复制到另一块内存中,并清空已使用的内存
- 标记清除算法:标记需要回收的对象,并清除
- 标记整理算法:标记存活对象,将其移相内存一端,清除端边界外的对象
- 分代收集算法:新生代-复制算法(Minior GC),老年代-标记整理算法(Major GC)
4 引用类型
- 强引用:最常见,如:将对象赋给一个引用变量,它处于可达状态,不会被GC 回收。强引用是造成内存泄漏的主要原因之一
- 软引用:使用SoftReference类实现,当系统内存足够时不会被回收,当系统内存不够时会被回收
- 弱引用:使用WeakReference类实现,只要GC一运行,就会被回收
- 虚引用:使用PhantomReference类实现,不能单独使用,必须和引用队列联合使用,用于跟踪对象被垃圾回收的状态