GC的阶段

对每个对象而言,垃圾回收分为两个阶段:finalization和reclamation。

finalization: 指运行这个对象的finalize的方法。

reclamation: 回收被这个对象使用的内存。

GC的过程的基本步骤

首先确认对象是不可达的,即将被回收。

其次,如果对象有finalize方法,那么对象被添加进finalization queue中;然后在某个时间点finalize方法被调用以释放finalize中的资源。

最后,回收对象占用的内存。

关于finalize方法的问题

finalize方法使得GC过程做了更多的事情,增加的GC的负担。

如果某个对象的finalize方法运行时间过长,它会使得其他对象的finalize方法被延迟执行。

finalize方法中如果创建了strong reference引用了其他对象,这会阻止此对象被GC。

finalize方法有可能以不可确定的顺序执行(也就是说要在安全性要求严格的场景中尽量避免使用finalize方法)。

不确保finalize方法会被及时调用,也许程序都退出了,但是finalize方法还没被调用。

对象引用的类型

Reference(or named Strong Reference)(强引用):普通类型的引用。

SoftReference(软引用):被这种引用指向的对象,如果此对象没要再被其他Strong Reference引用的话,可能在任何时候被GC。虽然是可能在任何时候被GC,但是通常是在可用内存数比较低的时候,并且在程序抛出OutOfMemoryError之前才发生对此对象的GC。SoftReference通常被用作实现Cache的对象引用,如果这个对象被GC了,那么他可以在任何时候再重新被创建。另外,根据JDK文档中介绍,实际JVM的实现是鼓励不回收最近创建和最近使用的对象。SoftReference类的一个典型用途就是用于内存敏感的高速缓存。

WeakReference(弱引用):如果一个被WeakReference引用的对象,当没要任何SoftReference和StrongReference引用时,立即会被GC。和SoftReference的区别是:WeakReference对象是被eagerly collected,即一旦没要任何SoftReference和StrongReference引用,立即被清楚;而只被SoftReference引用的对象,不回立即被清楚,只有当内存不够,即将发生OutOfMemoryError时才被清除,而且是先清除不常用的。SoftReference适合实现Cache用。WeakReference 类的一个典型用途就是规范化映射( canonicalized mapping )

PhantomReference(虚引用):当没有StrongReference,SoftReference和WeakReference引用时,随时可被GC。通常和ReferenceQueue联合使用,管理和清除与被引用对象(没有finalize方法)相关的本地资源。

衡量GC的指标(GC Metrics)

Throughput(吞吐量):所有没有花在执行GC上的时间占总运行时间的比重。

Pauses(暂停):当GC在运行时程序的暂停次数。或者是在感兴趣的暂停次数中,暂停的平均时长和最大时长。

Footprint(足迹?):当前使用的堆内存大小。

Promptness(及时性):不再使用的对象多久能被清除掉并释放其内存。

通用GC算法

Java所使用的所有的GC算法都是通用GC算法概念的变种。

通用GC算法的假设:

最近创建的对象很可能很快就不可达了(unreachable,即可被回收了),比如方法内部声明的本地变量,当程序运行出了本地变量的作用范围后,本地变量引用的对象就很快不可达了。

一个对象保持可达(reachable)的越久就越不可能被回收。

在Java GC中,对象被划分为generations(代)或spaces(空间)。Java把对象分为young(年轻代),tenured(年老代)和perm(永久代)。在GC过程中,对象从一个space(空间)移动到另一个space。

Object Spaces(对象空间)

Young:年轻代中保存着刚创建的对象,这个代中的对象能够“minor” or “major” 收集中被回收。

Tenured:年老代中保存着从年轻代中幸存下来的对象,只能够在“major”中被回收。

Perm:永久代中保存着JVM所需的对象,比如Class对象和Method对象,以及他们的字节码和内部字符串等。对Perm中的对象GC意味着所有的Class都被卸载了。

每块空间的大小由当前的对内存大小决定,并且能够在运行时改变。每个空间之间的关系如下图所示:

Young Spaces(年轻空间)

Eden space:存储自从上次GC完毕之后新创建的对象,除了属于Perm的对象。当minor collection发生时,Eden space中的对象或者GC清理掉,或者被移到survivor space。

Survivor spaces:这个空间中存储的是自从上次GC幸存下来的young object。在minor GC中,这些对象或者被GC清理掉,或者被移到另外一个survivor空间中。

Minor collections和Major collections

Minor collection当young space被占满时执行。它比major collections快,因为minor collection仅仅检查major collection相应的一个子集对象。minor collection比major collection发生的频率高。

Major collection当tenured space被占满时执行。他会清理tenured和young。

GC运行的三种方式

在java5和java6中有4中垃圾回收的算法,有一种算法将不再支持,剩余的三种垃圾回收算法是:serial,throughputandconcurrent low pause。

Stop the world(停止所有程序的方式):在这种方式运行的GC,在GC完成前,JVM中的所有程序都不允许运行。Serial collector此时做minor和major收集。Throughput collector此时做major collector。

Incremental(增量运行方式):目前没要Java GC算法支持这种运行方式。GC以这种方式运行时,GC允许程序做一小段时间的工作,然后做垃圾回收工作。

Concurrent(并行运行):Throughput collector此时做minor collect,Concurrent low pause collector此时做minor和major收集。在这种运行方式下,GC和程序并行的运行,因此程序仅仅被短暂的暂停。

GC算法

Serial算法: 使用-XX:+UseSerialGC开启此算法的GC。GC使用和应用程序相同的线程去做minor collection和major collection。

Throughput:使用-XX:+UseParallelGC开启此算法GC。GC使用多线程去做minor collection以减少程序停止的时间。但是对于major collection,还是使用同程序相同的线程去做。当具有多核cpu时,并且程序有大量的短生命周期的对象时,并且对程序停顿时间不限制时较好。

Concurrent Low Pause: 使用-XX:+UseConcMarkSweepGC开启此算法GC。使用多线程去做minor和major collection。当具有多核cpu,并且程序有大量的长生命周期的对象,并且对程序停顿时间有限制时,效果较好。

什么时候发生GC

GC发生的时刻受堆内存大小的影响。如果堆内存小,GC会执行的很快,但是又会很快的被填满,因此GC比频繁;如果堆内存很大,GC会执行的较慢,而且不会很快被填满,因此执行的比较频率比较低。

基本的GC调试

throughput goal -XX:GCTimeRatio=n: 表示花费总时间百分之多少的CPU时间去运行程序。

maximum pause time goal -XX:MaxGCPauseMillis=n:每次GC时程序暂停最多多少毫秒。

footprint goal:如果其他目标都达到了,那么首先减少heap size,直到前两个goal不再满足,然后再慢慢增加。直到满足前面两个goal。

-Xms=n (starting) and -Xmx=n (maximum) heap size,这两个参数应该都很熟悉,就是JVM使用的最小堆内存数和最大堆内存数。

-XX:MinHeapFreeRatio=n, -XX:MaxHeapFreeRatio=n:最小和最大的空闲堆内存和被使用堆内存的比例。当空闲堆内存比例小于MinHeapFreeRatio时,内存空间开始扩展。当空闲堆内存比例大于MaxHeapFreeRatio时,内存空间开始减小。

-XX:NewSize=n, -XX:MaxNewSize=n:默认的young space的大小(包括eden + survivor 1 + survivor 2)。

-XX:NewRatio=n:young和tenured的比例。

-XX:SurvivorRatio=n:每个survivor space 和 eden之间的比例。

-XX:MaxPermSize=n:perm的最大size。

-XX:TargetSurvivorRatio=n:每次GC之后幸存下来的空间的目标比例。

-XX:+DisableExplicitGC:当此参数打开时,在程序中调用System.gc()将会不起作用。默认是off。

-XX:+ScavengeBeforeFullGC:当打开此参数时,在每次major collection时先执行一次minor collection。默认打开。

-XX:+UseGCOverheadLimit:当打开此参数时,如果总运行时间的98%的时间都在做GC,则抛出OutOfMemmoryError。默认打开。

参考资料:http://java.ociweb.com/mark/other-presentations/JavaGC.pdf

gc算法 java_Java的GC机制及算法相关推荐

  1. 微信抢红包算法 java_java 实现仿照微信抢红包算法,实测结果基本和微信吻合,附demo...

    实现拼手气红包算法,有以下几个需要注意的地方: 抢红包的期望收益应与先后顺序无关 保证每个用户至少能抢到一个预设的最小金额,人民币红包设置的最小金额一般是0.01元,如果需要发其他货币类型的红包,比如 ...

  2. 汉诺塔算法 java_java实现汉诺塔算法

    package com.ywx.count; import java.util.Scanner; /** * @author Vashon * date:20150410 * * 题目:汉诺塔算法(本 ...

  3. Java-JVM虚拟机内存垃圾回收机制gc入门:引用类型,对象标记算法,回收算法,常见的 garbage collector

    文章目录 GC的优缺点 引用的四种类型 对象标记算法 引用计数法 可达性分析法 回收算法 标记-清除算法(Mark-Sweep) 复制算法 标记-整理算法(Mark-Compact) 分代收集算法 常 ...

  4. Java的GC机制及算法

    转载自   Java的GC机制及算法 GC的阶段  对每个对象而言,垃圾回收分为两个阶段:finalization和reclamation. finalization: 指运行这个对象的finaliz ...

  5. GC基本算法及C++GC机制

    前言 垃圾收集器是一种动态存储分配器,它自动释放程序不再需要的已分配的块,这些块也称为垃圾.在程序员看来,垃圾就是不再被引用的对象.自动回收垃圾的过程则称为垃圾收集(garbage collectio ...

  6. GC:垃圾回收机制及算法

    GC:垃圾回收机制及算法 关键词 算法:标记(清除/复制/整理).分代收集 收集器(Serial[串行].ParNew[并行].Parallel Scavenge[并行].Serial Old[串行] ...

  7. 34.对象 GC,GC属性,影响GC的因素,GC步骤,GC算法,安全区/安全区域,新生代,老年代等介绍

    34.对象 GC,GC属性,影响GC的因素,GC步骤,GC算法,安全区/安全区域,新生代,老年代等介绍 34.1.GC属性 34.2.影响GC的因素 34.3.GC步骤 34.3.1.Mark 34. ...

  8. 再谈GC1:GC简介,分代与回收算法

    说明:在本文中, Garbage Collection 翻译为 "垃圾收集", garbage collector 翻译为 "垃圾收集器";一般认为, 垃圾回收 ...

  9. JVM成神路之GC基础篇:对象存活判定算法、STW、GC种类详解

    引言 在前面分析JVM运行时内存区域时,其中程序计数器.虚拟机栈.本地方法栈三个区域随线程而生,伴线程而亡.而运行期间,栈的每个栈帧所需空间大小,其实在编译期就可大致确定,因此这几个区域的内存分配和回 ...

  10. (六)JVM成神路之GC基础篇:对象存活判定算法、GC算法、STW、GC种类详解

    引言 经过前面五个章节的分析后,对于JVM的大部分子系统都已阐述完毕,在本文中则开始对JVM的GC子系统进行全面阐述,GC机制也是JVM的重中之重,调优.监控.面试都逃不开的JVM话题. 在前面分析J ...

最新文章

  1. SAP MM 如何知道移动类型的字段选择和会计科目的字段选择是否不一致?
  2. 一步步学习webpack 1
  3. IETF:QUIC Version 1 (RFC 9000) 作为标准化版本现已发布
  4. OJ1114: 逆序(数组)(C语言)
  5. matlab画圆的命令_matlab画矩形和matlab画圆
  6. 对象转为json形式
  7. [乐意黎原创]PHP 老司机指南
  8. 怎么把图片压缩到30K以下?如何用手机快速压缩图片?
  9. Duplicate entry for key 'PRIMARY'
  10. JS文本中间显示省略号
  11. 程序员都需要学习什么
  12. 访问者模式(Visitor模式)
  13. MATLAB | 用cftool对excel的数据进行三维曲线拟合
  14. 线性回归模型预测利润
  15. 【面试攻略】服务端面试-边锋
  16. 高并发与大流量解决方案
  17. 编程时常犯的几个错误、应注意的事项以及技巧
  18. 室内设计优美语句_关于装修设计唯美的句子
  19. JavaScript的数学计算库:decimal.js
  20. 我用计算机写文章教学设计,教学教学设计(精选5篇)

热门文章

  1. 你有想过,如何用Hadoop实现【倒排索引】?
  2. gprs java_GPRS类型一览
  3. 网络创业者如何通过自己建站迈出躺赚第一步?
  4. 《物联网技术》课程笔记——第一章 物联网概述
  5. Class 'app\index\controller\News' not found 解决方案
  6. python学习——matplotlib颜色设置适合论文的配色
  7. RRT、RRTConnect、RRT*——Matlab算法
  8. Unity学习笔记-粒子篇
  9. 《编程小白的第一本python入门书》——读书笔记
  10. Excel的最大行数