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,throughput and concurrent 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 

Java的GC机制及算法的更多相关文章

  1. java垃圾回收机制--可达性算法

    先说一些题外话,Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区,这些区分为线程私有区和线程共享区 1.线程私有区 a.程序计数器 记录正在执行的虚拟机字节码指令地址 ...

  2. Java 虚拟机 - GC机制

    GC机制的一些总结 https://blog.csdn.net/super_qing_/article/details/85263991 https://blog.csdn.net/yhyr_ycy/ ...

  3. JVM(3)对象A和B循环引用,最后会不会不被GC回收?-------关于Java的GC机制

    ①首先说一下,GC里边在JVM其中是使用的ROOT算法,ROOT算法,什么称作为ROOT呢,就是说类的静态成员,静态成员就是static修饰的那种,是"根"的一个,根还包含方法中的 ...

  4. JAVA 调用gc机制强制删除文件

    在删除文件前调用System.gc()方法,也就是垃圾回收机制,即可成功删除被JAVA虚拟机占用的文件.

  5. java垃圾回收机制GC

    记得第一次总结java 的GC的时候,是刚开始在课堂上学习GC的时候,那时候许老师第一节java课 课后老师说同学们可以去深入理解一下java的GC机制: 但是是花费了三四个小时,翻看了<Thi ...

  6. Java Garbage Collection基础详解------Java 垃圾回收机制技术详解

    最近还是在找工作,在面试某移动互联网公司之前认为自己对Java的GC机制已经相当了解,其他面试官问的时候也不存在问题,直到那天该公司一个做搜索的面试官问了我GC的问题,具体就是:老年代使用的是哪中垃圾 ...

  7. 成为JavaGC专家(1)—深入浅出Java垃圾回收机制

    转载自:http://www.importnew.com/1993.html 对于Java开发人员来说,了解垃圾回收机制(GC)有哪些好处呢?首先可以满足作为一名软件工程师的求知欲,其次,深入了解GC ...

  8. 转:成为JavaGC专家Part I — 深入浅出Java垃圾回收机制

    文章来自于:http://www.importnew.com/1993.html 对于Java开发人员来说,了解垃圾回收机制(GC)有哪些好处呢?首先可以满足作为一名软件工程师的求知欲,其次,深入了解 ...

  9. Java垃圾回收机制以及内存泄露

    1.Java的内存泄露介绍 首先明白一下内存泄露的概念:内存泄露是指程序执行过程动态分配了内存,可是在程序结束的时候这块内存没有被释放,从而导致这块内存不可用,这就是内存 泄露,重新启动计算机能够解决 ...

随机推荐

  1. LeetCode--050--Pow(x,n)

    实现 pow(x, n) ,即计算 x 的 n 次幂函数. 示例 1: 输入: 2.00000, 10 输出: 1024.00000 示例 2: 输入: 2.10000, 3 输出: 9.26100 ...

  2. git使用技巧总结

    一.把github上的代码下载下来 git clone ...... 二.把修改的代码提交上去 git add .... git commit -m "........" git ...

  3. Incorporating ASP.NET MVC and SQL Server Reporting Services, Part 2

    In the last issue, I introduced you to the basics of incorporating SQL Server Reporting Services int ...

  4. [tyvj]P1939玉蟾宫[单调栈]

    [tyvj]P1939 玉蟾宫 ——!x^n+y^n=z^n 背景 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地. 描述 这 ...

  5. 【CF1253A】Single Push【模拟】

    题意:给你两个数组a,b,求是否存在操作使得a变成b,操作为选取一段子区间[l,r],选一个正整数k,使得ai+=k,i∈[l,r],只能操作一次 题解:模拟即可 #include<iostre ...

  6. 解决Windows2003 Server终端服务120天限制

    用过windows server 2003做服务器的人都知道,windows2003的性能安全性比以前的windows版本高出很多,但是也带来很多麻烦.其中服务器最重要的远程管理“终端服务”居然要求授 ...

  7. [design pattern](0) 概述

    一 引语 大家好,这是我第一次在网上写文章.从学校毕业一年多,感觉还有很多东西需要去学习.最近正在学习设计模式,希望可以在博客园把我学习的知识记录下来,能够和大家一起讨论设计模式相关的话题,也希望这个 ...

  8. [CSP-S模拟测试]:Silhouette(数学)

    题目描述 有一个$n\times n$的网格,在每个格子上堆叠了一些边长为$1$的立方体. 现在给出这个三维几何体的正视图和左视图,求有多少种与之符合的堆叠立方体的方案.两种方案被认为是不同的,当且仅 ...

  9. Log4j appender、layout

    appender输出类型配置 layout日志信息格式 Threshold属性指定输出等级 Append属性指定是否追加内容 (1)appender输出类型配置 Log4j官方的appender给出了 ...

  10. 测开之路六十:接口测试平台之common目录

    实现接口测试平台使用jsonpath进行取值来断言,效果: 访问页面: 调试功能:http://www.kuaidi100.com/query 保存功能 触发执行功能 查看报告功能 目录结构 comm ...