JVM

JVM内存模型(每个线程独立拥有,线程结束后销毁)

线程私有区

  • 程序计数器:记录当前线程字节码行号指示器,用于线程切换之后恢复执行位置。唯一不会抛出OutOfMemorryError区域
  • 虚拟机栈:每一个方法对应一个栈帧,方法执行入栈,方法结束出栈,包含局部变量表,操作数,方法出口等。递归出错会造成栈溢出,动态扩展无法申请到足够的空间内存溢出报错
  • 本地方法栈:用c,c++写的Native方法

线程共享区

  • 堆空间:JVM最大内存区域,存放对象实例和数组,GC回收核心区域,分为新生代,老生代
  • 元空间:代替之前的永生代,位于本地内存(为了避免永久代内存溢出,利用本地内存)。主要存储了一些元信息,静态变量,JIT编译之后的代码

JVM内存模型和JMM内存模型区别

  • JVM:解决内存如何存储的问题
  • JMM:定义多线程之间的共享变量的可见性,原子性,有序性规则,解决多线程并发问题

OOM溢出出现的位置

  • 虚拟机栈、本地方法栈:递归过深栈溢出,动态扩展内存不足OOM,JVM无法满足这个栈空间的扩容需求
  • Java堆:对象数量超过堆的最大容量
  • 元空间:类元素信息过多

JVM垃圾回收

判断对象已死

  • 引用计数法:有引用+1,没有-1,计数器为0判断为垃圾。但是无法解决循环引用的问题
  • 可达性分析:以GC Roots为起点,向下搜索所有引用,如果不可达就是可回收对象。
  • GC Roots包含的对象:虚拟机栈中引用对象,方法区中静态属性引用的对象,方法区中常量引用的对象,本地方法栈中native引用的对象

4中核心回收算法

  • 标记-清除
  • 标记复制
  • 标记-整理
  • 分代收集:前面三种算法的组合策略
posted @ 2025-12-14 12:34  Huangyien  阅读(4)  评论(0)    收藏  举报