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)
评论()
收藏
举报