前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Jvm对象回收算法-JVM(九)

Jvm对象回收算法-JVM(九)

作者头像
用户9919783
发布2023-09-05 14:33:06
1170
发布2023-09-05 14:33:06
举报
文章被收录于专栏:后端从入门到精通

上篇文章介绍了jvm运行时候对象进入老年代的场景,以及如何避免频繁fullGC。

Jvm参数设置-JVM(八)

一、老年代分配担保机制

这个机制的目的是为了提升效率,在minorGC之前,会有三次判断,之后再次minorGC速度会很快。

1、老年代剩余空间是否 大于 年轻代里现在所有对象

大于的话则直接minorGC

2、如果不大于则看看参数是否配置:-XX:-HandlerPromotionFailure

没有配置则直接fullGC

3、配置了则看看 老年代剩余可用空间是否 大于 每次minorGC后进入老年代的平均值

大于的话直接minorGC,否则直接fullGC

FullGC之后最后还是会minorGC。

二、对象内存回收

1、引用计数器

这个方法简单效率高,但目前主流虚拟机没有用表格这个算法,主要不能解决循环引用问题。因为两者相互引用,导致他们引用计数器不为0,而引用计数器必须是为0才会回收。

2、可达性分析算法

将GC roots对象作为节点,向下搜索,找到对象都标记为 非垃圾对象,其余未标记的都是 垃圾对象。

GC roots根节点,:线程栈本地变量,静态变量,本地方法栈变量等。

三、常见引用类型

引用类型:强引用,软引用,弱引用,虚引用

1、强引用:User user = new User();

2、软引用:用SoftReference软引用类型包裹对象, 正常不会被回收,但GC做完释放不出空间放新对象,则会回收。软引用可以作用在内存敏感的高速缓存。

SoftReferenceuser = new SoftReference(new User());

软引用在实际场景很重要,例如浏览器后退按钮,这个后退是重新加载还是从缓存里取,这要看实际应用场景。

1)如果一个浏览器进入新页面就内容回收,则需要重新加载。

2)如果浏览页面内存很大,放在内存会内存溢出。

3、弱引用GC每次会直接回收。

WeakReferenceuser = new WeakReference(new User());

4、虚引用也成为幽灵引用,几乎不用。

四、finalize()方法最终判断对象是否存活

当对象背回收之前,会判断这个对象是否覆盖了finalize方法,如果覆盖了,在回收之前则会执行这个方法,不回收则不执行。

既然在回收之前会执行,那么自然可以自救,可以把当前对象放入静态list集合保证在使用则不会被收回。(不推荐使用)

五、如何判断一个类是无用的类

方法区如果发生回收的条件,必须这个类是无用的类:

1、该类所有对象实例都被回收,也就是java堆中不存在该类任何实例。

2、加载该类的ClassLoader已经被回收。(CLassLoader回收条件很苛刻)

前面说过引导类(核心包)BootStrapClassLoader,扩展ClassLoader以及appClassLoader应用程序的classLoader,这些不会被回收。

但是jsp的加载器,每个jsp都对应一个新的加载器,这种加载器就很容易被回收。(一般自定义的才会回收)

3、该类的java.lang.Class对象没有地方被引用,无法在任何地方通过反射访问该类信息。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-07-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 后端从入门到精通 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档