javaGC笔记
2022/1/6 22:04:01
本文主要是介绍javaGC笔记,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
判断是否被清理标准是由"GCRoot"来决定的
满足以下三种情况则不会被清理
跟"GCRoot"没有引用关系的会被清除
1.被栈上的引用直接或间接引用
2.被本地方法栈直接或间接引用的对象
3.方法区静态或常量直接或间接引用的对象
三种清理算法
1.标记-清理:在需要删除的对象上打标(缺点:会产生内存碎片)
例:清楚两块1kb的内存后,有一个2Kb的对象将不能使用这两个1Kb的内存2.标记-整理:删除后,后面的对象全部向前移动,可以减少内存碎片
缺点:代价太大,所有对象都需要向前移动3.复制算法:将内存一分为二,分为1区和2区,将需要删除的元素进行标记,等到快满时,将没有标记的对象复制到2区(紧凑复制)
缺点:需要两倍内存
GC内存分配大概是这样的
每次new对象时会存在 E 区(Eden),当 E 区快满时,会触发YoungGC,并采用复制算法,将不需要删除的对象存入S区(对象"朝生夕死",比例约为1:1:8(默认设置))
每次YoungGC存活的对象年龄+1,知道满6岁后就不会再往S区复制,下次直接进入Old区
官方文档,15是最大值,7是初始值。晋升的岁数是个动态变化的值,在每次gc的时候都会重新计算,这和s区存活率(默认50%)等其他参数有关,可以通过-XX:+PrintTenuringDistribution来查看每次gc的时候确定下来的新的晋升年龄阈值。
再严谨一点,MaxTenuringThreshold在不同的垃圾收集器里的默认值也是不同的,对Parallel Scavenge来说这个值默认是15,对G1来说这个值默认是15,对CMS来说这个值默认是6(粘贴别人的!!!)
两个S区交替工作,E区幸存的先存入S0区,再将S和E区全部删除,等下一次E区快满时,将S0和E区所有对象进行打标删除,未打标复制到S1区.S0和S1交替使用,比直接将内存一分为二的利用率高
存储大对象时直接会到Old区,因为Young区来回复制哦比较消耗资源,所以直接存入Old区,当Old区快满时,一般会同时伴随YoungGC,也叫FullGC,会引起Stop the world(暂停服务),服务暂停后整个Java程序停止,权力进行垃圾回收,主要采用 "标记-清理" "标记-整理" 算法.
这种收集器已经过时了,因为新版本采用了全新的G1垃圾收集器
完结!!!
这篇关于javaGC笔记的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-27消息中间件底层原理资料详解
- 2024-11-27RocketMQ底层原理资料详解:新手入门教程
- 2024-11-27MQ底层原理资料详解:新手入门教程
- 2024-11-27MQ项目开发资料入门教程
- 2024-11-27RocketMQ源码资料详解:新手入门教程
- 2024-11-27本地多文件上传简易教程
- 2024-11-26消息中间件源码剖析教程
- 2024-11-26JAVA语音识别项目资料的收集与应用
- 2024-11-26Java语音识别项目资料:入门级教程与实战指南
- 2024-11-26SpringAI:Java 开发的智能新利器