请选择 进入手机版 | 继续访问电脑版
查看: 102|回复: 0

[面试] jvm的堆内存是如何使用垃圾回收器进行垃圾回收的以及有哪些垃圾回收器

[复制链接]

[面试] jvm的堆内存是如何使用垃圾回收器进行垃圾回收的以及有哪些垃圾回收器[复制链接]

zygxsq 发表于 2020-9-5 01:35:32 [显示全部楼层] |只看大图 回帖奖励 |倒序浏览 |阅读模式 回复:  0 浏览:  102
堆内存被划分为两块,一块的年轻代,另一块是老年代。

年轻代又分为Eden和survivor。他俩空间大小比例默认为8:2,

幸存区又分为s0和s1。这两个空间大小是一模一样的,就是一对双胞胎,他俩是1:1的比例

013532zqopk6666s6g6266.jpg

堆内存垃圾回收过程

第一步

新生成的对象首先放到Eden区,当Eden区满了会触发Minor GC。

第二步

第一步GC活下来的对象,会被移动到survivor区中的S0区,S0区满了之后会触发Minor GC,S0区存活下来的对象会被移动到S1区,S0区空闲。

S1满了之后在GC,存活下来的再次移动到S0区,S1区空闲,这样反反复复GC,每GC一次,对象的年龄就涨一岁,达到某个值后(15),就会进入老年代。

第三步

在发生一次Minor GC后(前提条件),老年代可能会出现Major GC,这个视垃圾回收器而定。

Full GC触发条件

手动调用System.gc,会不断的执行Full GC

老年代空间不足/满了

方法区空间不足/满了

stop-the-world 意味着JVM因为需要执行GC而停止应用程序的执行。
当stop-the-world 发生时,除GC所需的线程外,所有的线程都进入等待状态,直到GC任务完成。GC优化很多时候就是减少stop-the-world 的发生。

回收哪些区域的对象
需要注意的是,JVM GC只回收堆内存和方法区内的对象。而栈内存的数据,在超出作用域后会被JVM自动释放掉,所以其不在JVM GC的管理范围内。

更多详细内容以及垃圾回收器的种类可以戳链接查看:https://mp.weixin.qq.com/s/fyorrpT5-hFpIS5aEDNjZA


来自安卓客户端来自安卓客户端
回复

使用道具 举报

QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1
QQ