分享
JVM内存区域详解【内存分布、回收算法、垃圾回收器】
输入“/”快速插入内容
JVM
内存
区域详解【内存分布、回收算法、
垃圾回收
器】
用户8522
用户8522
2024年1月13日修改
内存
区域
画板
堆其实就是一大块
内存
区域,是用来存放对象的,对于一个应用来说最耗费内存的就是“对象”。因为在运行的过程中会创建无数个对象,所以内存回收(
垃圾回收
)的时候主要就是针对堆的垃圾进行回收。
常见的堆划分是:
1.
把堆分为新生代和老年代
2.
新生代分为一个Eden区和两个Survivor区,它们的
内存
占比是 8:1:1
3.
注:但G1却不是这样的,它把堆分成数个大小相同的Regin块
各个区域
OOM
实践
回收时机
上面我们谈到
内存
空间,内存是有限的,想要健康持续的运行下去,就一定要回收“垃圾”。
那怎么判定一个对象是不是垃圾呢,就成了新的问题。
GC
Roots并不是一个固定的对象,它是一组对象:
1.
在
虚拟机
栈引用的对象,譬如各个线程被调用的方法堆栈中使用到的参数、
局部变量
、临时变量等。
2.
在方法区中类静态属性引用的对象,譬如Java类的引用类型静态变量。
3.
在方法区中常量引用的对象,譬如字符串
常量池
里的引用。
4.
在本地方法栈中JNI(即 Native方法)引用的对象。
5.
Java虚拟机
内部的引用,如基本
数据类型
对应的Class对象。
6.
所有被
同步锁
(Sync)持有的对象。
7.
除了这些固定的
GC
Roots,根据不同的
垃圾回收
器还可以有其他“临时性”地加入。
一个对象是否可以被回收,是要看有没有被
GC
Roots触达,而不是仅仅是 触达