JVM核心考点整理

1 JVM运行机制

JVM核心考点整理
JVM运行机制
  • 类加载机制: 类加载过程由类加载器来完成,即由ClassLoader及其子类实现,有隐式加载显示加载两种方式。隐式加载是指在使用new等方式创建对象时会隐式调用类加载器把对应的类加载到JVM中;显示加载是指通过直接调用Class.forName()把对应的类加载到JVM中
  • 内存模型(运行时数据区):共享区【方法区(栈)、堆、虚拟机栈】、私有区【本地方法栈、程序计数器】、直接内存(不受JVM GC管理)。其中程序计数器是唯一不会出现OOM的内存区。
  • 执行引擎:即时编译器、垃圾收集器(按代回收算法新生代-复制算法(MinorGC),老年代-标记整理算法(MajorGC)

2 内存区域

JVM核心考点整理
内存模型
  • 方法区(栈/永久代) :用于存储被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类实现,不能单独使用,必须和引用队列联合使用,用于跟踪对象被垃圾回收的状态