GC

Garbage Collect 垃圾回收

如何确定一个对象是垃圾

  • 引用计数法
  • 对于一个对象而言,如果应用程序持有该对象的引用,就说明该对象不是垃圾,如果一个对象没有任何指针对其引用,那么这个对象就是垃圾。
  • 缺点:如果两个对象互相持有彼此的引用,那么这个对象永远不会被回收。
  • 可达性分析法
  • 定义:通过GC Root的对象,开始向下寻找,看某个对象是否可达。
  • 能作为GC Root的:类加载器、Thread、虚拟机栈中的本地变量表、static成员、常量引用、本地方法栈的变量等。

垃圾收集算法

  • 标记-清除
  • 定义:扫描堆中的所有对象,找出需要回收的垃圾,并标记出来;扫描完成后,对标记的对象进行清除,释放内存空间。
  • 缺点: 标记和清除两个过程都是需要扫描堆中的所有对象,比较耗时,效率不高。 会产生大量不连续的内存碎片,空间碎片过多可能会造成后续对象找不到一个连续的内存空间而不得不触发一次GC操作。
  • 复制
  • 定义:将内存空间分割成两个相等的区域,每次只使用一块。(堆区中的Young区的Survivor区)
  • 缺点:空间利用率低。
  • 标记-整理
  • 扫描堆中所有的对象,找出需要被回收的垃圾,并标记出来;标记完成后,所有存活的对象往一边移动,清除掉边界以外的对象。

垃圾收集器

  • Serial收集器

单线程收集器,在进行GC的时候需要暂停其他线程。(复制算法,适用于新生代–Young区)。

  • ParNew收集器

多线程收集器,在GC时需要暂停其他线程。(多核CPU情况下,效率比Serial收集器高,复制算法,适用于新生代—Young区)。

  • Parallel Scavenge收集器

多线程,采用复制算法的新生代收集器,关注系统的吞吐量。

吞吐量 = 运行用户代码的时间/(运行用户代码的时间+垃圾收集时间)。
吞吐量越大,垃圾收集时间越短,程序运行效率越高。

-XX:GCTimeRatio 直接设置吞吐量大小

  • Serial Old收集器

单线程收集器,进行GC时需要暂停其他线程。(标记-整理算法,对老年代进行收集)

  • Parallel Old收集器

多线程收集器,采用标记-整理算法对老年代进行GC。

  • CMS收集器

一种以获取最短停顿时间为目标的收集器。

  • G1收集器:

特点 :并行与并发、 分代收集、 空间整合(属于标记-整理算法)、可预测的停顿。

垃圾收集器分类

  • 串行收集器:Serial和Serial Old,只能有一个垃圾回收线程执行,其他线程暂停。
  • 并行收集器:Parallel Scanvenge 和Parallel Old,多条垃圾线程并行工作,但此时用户线程暂停。
  • 并发收集器:CMS和G1,垃圾回收线程和用户线程并行执行(可能是交互执行),垃圾回收线程在执行期间不会停顿用户线程的执行。

如何选择垃圾收集器

优先调整堆的大小让服务器自己来选择。
如果内存小于100M,使用串行收集器。
如果是单核,并且没有停顿时间要求,使用串行或者JVM自己选。
如果允许停顿时间超过1秒,选择并行或者JVM自己选。
如果响应时间最重要,并且不能超过1秒,选择并发收集器。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值