JVM 垃圾回收详细总结


对于JVM垃圾的定义:


就是JVM中不用的内存空间就是内存垃圾需要收回的,识别垃圾的方法有两种计数引用和枚举节点可达性分析。
第一种方法是:计数引用就是给对象添加一个计数器,对象被引用一下,计数器就会加一,当对象引用失败时,计数器就会减一,当对象的计数值为0 时,对象就被收回,该方法的缺点是处理不了对象循环引用。

第二种方法是:以gc ROOT 为根节点,遍历对象图,当对象能遍历到,就是一个可达性对象,当对象不能到达的时候,也就是没有引用链的时候,这个对象就是被收回的垃圾。一般的我们都是以集合的引用对象为根节点,遍历对象图,当对象能遍历到,就是一个可达性对象,当对象不能到达的时候就是被收回的垃圾。

在我们JVM中能作为GC root的对象的有栈中的局部变量,也成局部变量列表、方法的类静态属性的引用的对象以及常量的引用的对象、本地方法中的native的引用。


垃圾回收的算法:


引用计数:
就是给对象添加一个计数器,对象被引用一下,计数器就会加一,当对象引用失败时,计数器就会减一,当对象的计数值为0 时,对象就被收回。
复制:
就是把分给的堆内存的进行分成大小相等的两个内存空间,每次使用一半,当一个内存空间的对象满时,就进行一次清理,把存活的对象进行复制到另一个空的内存空间中去,就是说分配内存的时候也就不需要进行考虑内存碎片的问题,只是进行堆内存指针的移动而已,实现简单,运行高效。
标记清处:
我们先对对象进行标记,标记要收回的对象,然后进行统一的资源收回,该方法的缺点是标记和清楚都是效率都是很低的而且会产生大亮点内存空间碎片的问题。
标记整理:
就是在标记清除的基础,进行内存空的行了压缩。解决了标记清除算法的产生了大量的内存空间碎片的问题。


垃圾回收算法和垃圾回收器的关系


垃圾回收算法就是理论指导,垃圾回收器就是理论指导的落地实现。直到目前也没有完美的垃圾回收器,我把垃圾回收器分成了四大类:
串行垃圾回收器、
就是单线程来进行垃圾收集,需用暂停用户线程
并行垃圾回收器、
就是多线程来进行垃圾收集,需用暂停用户线程,主要用大数据场景,对响应速度不是很强的场景。
并发垃圾回收器、
就是多个线程进行垃圾回收和用户线程一起,不需要暂停用户线程,该场景用于该并发场景,一般用B/S系统中,前台交互比较强的场景中,对响应速度比较强的场景 。
G1垃圾回收器。
就是把堆内存空间进行分割几个分区然后并发的进行垃圾回收。

具体的分类有七种。当然引用的那个垃圾回收器就是不说,还行剩六种。具体的指的是useSerialGC、
useParallelGC、
useConcMarkSweepGC、
useParNewGC、
useParOldGenGC、
useG1GC

按照JVM的内存划分年轻代和年老代,以及永久代,这是java7 的划分。java8把永久代代替成mateSpaceVM。
他两的主要区别是;永久代主要用的还是堆内存空间,而matespace用的是本地的内存空间。

我按内存划分把垃圾回收器分成了大两类:年轻代垃圾回收器和年老垃圾回收器。
年轻代:
串行 serial
并行 parNew
并行回收 parallel Scavenge

年老代:
串行 serial old
并行 parallel old
并发标记清除 concmarksweep

并发标记清除该GC 处理步骤很麻烦
初始标记:就是标记一下跟GC root 能直接关联的对象,速度很快,但是还是需要暂停线程。
并发标记:就是跟踪GC root 的过程,和用户线程一起工作,不需要进行暂停线程,主要是标记过程,标记全部对象。
重新标记:就是行修正部分线程继续工作带来的部分的对象的标记变动,需要暂停用户线程。
并发清除:就是清除GC root 不能直接关联的对象的线程和用户线程一起工作。不需要暂停线程,主要基于标记对象,进行处理对象。

缺点是:
1、该垃圾回收器进行CMS进行收集和与应用程序线程一起的时候会对堆内存产生很大的压力。也就是说,CMS 必须在年老代的存储使用完之前进行垃圾回收完成。否则CMS收集失败。触发担保机制,使用serial old 来进行使用stw的来进行一次GC,从而造成了很长时间的暂停时间。

2、还有一点是就是会产生大量的内存空间的碎片


垃圾回收器的在现实中的使用情况


分为两种情况,一就是单cpu 和多cpu的,单个的cpu现在几乎不用了,就考虑多个Cpu的
cpu的又以响应速度的分为两种情况,响应速度不高的 -xx:+useParallelGC -xx:+useParallelOldGC 响应速度高的 -xx:+useConcMarkSweepGC -xx:+useParNew

了解G1GC
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值