JVM:垃圾回收

如何判断对象可以回收

引用计数法

只要一个对象被其他变量所引用,让其计数+1,不在引用了,计数-1。当这个对象引用对象为0时回收。

但会出现一个弊端:循环引用问题,会导致这两个对象不能被回收,造成内存泄漏。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-quYOZLGA-1685604280751)(D:\TextPictureAssets\QQ截图20220812191554.jpg)]

JVM未采用引用计数法进行垃圾回收

可达分析算法

Java 虚拟机中的垃圾回收器采用可达性分析来探索所有存活的对象。

可达分析算法:可达分析法需要确定根对象,根对象即那些肯定不能当作垃圾被回收的对象,垃圾回收时,会扫描堆中的所有对象,若对象被根对象直接或间接引用,就不能被回收,反之,则可以被回收(即能否沿着 GC Root对象为起点的引用链找到该对象,找不到,表示可以回收 )。

哪些对象可以作为 GC Root ?

System Class、Native Stack、Thread、Busy Monitor(锁相关的对象)

五种引用

**强引用:**只有所有 GC Roots 对象都不通过【强引用】引用该对象,该对象才能被垃圾回收

**软引用(SoftReference):**仅有软引用引用该对象时,在垃圾回收后,内存仍不足时会再次出发垃圾回收,回收软引用对象;可以配合引用队列来释放软引用自身

**弱引用(WeakReference):**仅有弱引用引用该对象时,在垃圾回收时,无论内存是否充足,都会回收弱引用对象;可以配合引用队列来释放弱引用自身

**虚引用(PhantomReference):**必须配合引用队列使用,主要配合 ByteBuffer 使用,被引用对象回收时,会将虚引用入队,由 Reference Handler 线程调用虚引用相关方法(Unsafe.freeMemory()方法)释放直接内存

**终结器引用(FinalReference):**无需手动编码,但其内部配合引用队列使用,在垃圾回收时,终结器引用入队(被引用对象暂时没有被回收),再由 Finalizer 线程通过终结器引用找到被引用对象并调用它的 finalize 方法,第二次 GC 时才能回收被引用对象

垃圾回收算法

标记清除(Mark Sweep)

图中灰色的部分(即没被GC Root引用)就是标记需要清除的部分

在这里插入图片描述

优点:速度快

缺点:会造成内存碎片

标记整理(Mark Compact)

在这里插入图片描述

优点:没有内存碎片

缺点:速度慢

复制(Copy)

在这里插入图片描述

优点:不会有内存碎片

缺点:需要占用双倍内存空间

分代垃圾回收

在这里插入图片描述

  • 对象首先分配在伊甸园区域
  • 新生代空间不足时,触发 minor gc,伊甸园和 from 存活的对象使用 copy 算法复制到 to 中,存活的对象年龄加 1并且交换 from 与 to 的位置
  • minor gc 会引发 stop the world,即暂停其它用户的线程,等垃圾回收结束,用户线程才恢复运行
  • 当对象寿命超过阈值时,会晋升至老年代,最大寿命是15(4bit)
  • 当老年代空间不足,会先尝试触发 minor gc,如果之后空间仍不足,那么触发 full gc,full gc 同样会引发stop the world,且 s t w 的时间更长
  • 若 full gc 后仍然空间不足,则引发 OOM

相关 VM 参数

含义参数
堆初始大小-Xms
堆最大大小-Xmx 或 -XX:MaxHeapSize=size
新生代大小-Xmn 或 (-XX:NewSize=size + -XX:MaxNewSize=size )
幸存区比例(动态)-XX:InitialSurvivorRatio=ratio 和 -XX:+UseAdaptiveSizePolicy
幸存区比例-XX:SurvivorRatio=ratio
晋升阈值-XX:MaxTenuringThreshold=threshold
晋升详情-XX:+PrintTenuringDistribution
GC详情-XX:+PrintGCDetails -verbose:gc
FullGC 前 MinorGC-XX:+ScavengeBeforeFullGC

垃圾回收器

串行

  • 单线程
  • 堆内存较小,适合个人电脑

开启串行垃圾回收器:-XX:+UseSerialGC = Serial + SerialOld

吞吐量优先

  • 多线程
  • 堆内存较大,多核 cpu
  • 让单位时间内,STW 的时间最短 比如一次0.2秒,一个小时内(即单位时间内)2次回收0.2 0.2 = 0.4,垃圾回收时间占比最低,这样就称吞吐量高

相关参数:

-XX:+UseParallelGC(新生代:采用复制算法) ~ -XX:+UseParallelOldGC(老年代:采用标记+整理算法)

-XX:+UseAdaptiveSizePolicy(自适应调整策略。主要用于新生代)

-XX:GCTimeRatio=ratio

-XX:MaxGCPauseMillis=ms

-XX:ParallelGCThreads=n

响应时间优先

  • 多线程
  • 堆内存较大,多核 cpu
  • 尽可能让单次 STW 的时间最短,比如每次0.1秒,0.1 0.1 0.1 0.1 0.1 = 0.5

相关参数:

-XX:+UseConcMarkSweepGC ~ -XX:+UseParNewGC ~ SerialOld

-XX:ParallelGCThreads=n ~ -XX:ConcGCThreads=threads

-XX:CMSInitiatingOccupancyFraction=percent

-XX:+CMSScavengeBeforeRemark

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值