Java的GC机制及算法

转载自   Java的GC机制及算法

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  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/327971.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

19年8月 字母哥 第一章 spring boot 2.x基础及概念入门 这里全部看完了 热部署没出来 第二章在前面2页 用热点公司网不行

http://springboot.zimug.com/1233100 文档 http://www.zimug.com/page/5 字母哥个人博客 11111 第一章 spring boot 2.x基础及概念入门 1.1.spring boot 产生的背景及其优势 1.2.spring boot 2.x 新特性说明 1.3.helloworld及项目结构介绍 1.4.IDEA结合spring b…

dell 恢复介质_戴尔官方WIN10恢复介质镜像下载与安装教程 | Dell 中国

前提:准备一个8G以上的空U盘相关视频请点击如何制作并使用win10 USB安装镜像目录:一、制作U盘安装介质1.打开链接,点击"下载OS Recovery Tool",2.运行下载好的 OS Recovery Tool ,点击INSTALL,3.安装完成&am…

CSS3(笔记)

CSS简介 CSS是什么 Cascading Style Sheet层叠样式表 CSS:表现(美化网页) 字体,颜色,边距,高度,宽度,背景图片,网页定位,网页浮动 CSS怎么用(快…

19年8月 字母哥 第三章 spring boot 配置原理实战 用热点公司网不行

第三章 spring boot 配置原理实战 3.1.结合配置加载讲解bean自动装配原理 3.2.详解YAML语法及占位符语法 3.3.获取自定义配置的两种实现方法 3.4.配置文件注入值数据校验 3.5.加载旧项目配置文件的两种方式 这节课就是适配老的项目而已所以要新建分支 因为不是很常用 3.6.profi…

.NET Core跨平台图形处理库ImageSharp

ImageSharp 是支持.NET Core跨平台图形处理库,ImageSharp是ImageProcessor 的.NET Core跨平台实现。 ImageSharp 支持如下操作: 调整大小,裁剪,翻转,旋转,边缘检测等。 支持BMP,PNG,…

JVM GC参数以及GC算法的应用

转载自 JVM GC参数以及GC算法的应用1. 串行收集器 串行收集器是最古老,最稳定以及效率高的收集器可能会产生较长的停顿,只使用一个线程去回收-XX:UseSerialGC新生代、老年代使用串行回收新生代复制算法老年代标记-压缩串行收集器的日志输出&#xff1a…

hibernate正向生成数据库表以及配置——Student.java

package cn.bdqn.studentInfo.entity;import java.util.HashSet; import java.util.Set;/*** 学生表的实体类* author Administrator**/ public class Student {private Integer id;private String name;private Set<Teacher>teachersnew HashSet<Teacher>();publi…

全局配置_配置全局异常处理,结果没有想到,spring boot实践(3)

01 spring boot读取配置信息02 多环境配置这个功能详细大家在项目中也经常遇到&#xff0c;通常我们在写controller的时候会定义一个全局的异常处理。任何的controller出现异常都会进入到这个全局异常统一抛出&#xff0c;同时我们也可以定义一个自定义的异常类来处理一些特殊的…

蓝桥杯JAVA省赛2013-----B------5(有理数类)

五、有理数类 【答案】&#xff1a;Rational(this.rax.rb this.rbx.ra, this.rb*x.rb) public class Test01 {static class Rational //内部类 【main调用内部类 &#xff1a; 内部类前 要加 static】{private long ra;private long rb;private long gcd(long a, long b…

19年8月 字母哥 第四章 常用web开发数据库框架 不要用公司网络加载不出来 用热点!!!

第四章 常用web开发数据库框架 4.1.整合Spring JDBC操作数据 4.2 Spring JDBC多数据源的实现 4.3.Spring JDBC JTA实现分布式事务 4.4.ORM主流框架选型 4.5.bean转换Dozer的快速上手 4.6.整合Spring Data JPA操作数据 4.7.Sp…

分库分表的几种常见形式以及可能遇到的难

在谈论数据库架构和数据库优化的时候&#xff0c;我们经常会听到“分库分表”、“分片”、“Sharding”…这样的关键词。让人感到高兴的是&#xff0c;这些朋友所服务的公司业务量正在&#xff08;或者即将面临&#xff09;高速增长&#xff0c;技术方面也面临着一些挑战。让人…

JVM 调优和垃圾回收器说明

转载自 JVM 调优和垃圾回收器说明JVM垃圾收集算法JVM垃圾收集算法有四种&#xff1a;标记-清除算法、复制算法、标记-整理算法、分代收集算法标记-清除算法&#xff1a;该算法如同它的名字一样&#xff0c;分为两个阶段&#xff1a;标记、清除。首先标记出所有需要回收的对象…

python中的数组按顺序切片_python切片(获取一个子列表(数组))详解

切片&#xff1a;切片指从现有列表中&#xff0c;获取一个子列表返回一个新列表&#xff0c;不影响原列表。下标以 0 开始&#xff1a;list [红,绿,蓝,白,黑,黄,青]# 下标 0 1 2 3 4 5 6取单个值语法&#xff1a;列表[n]n为下标&#xff0c;n0表示第一个 &#xff0c; n1表示第…

.net core快速上手

2014年11月12日的Connect ();开发者活动上宣布将.NET堆栈基于MIT协议开源&#xff0c;并且提供开源保证&#xff0c;托管在Github上。当时的版本与最终目标相距甚远&#xff0c;然而有一点可以肯定的是&#xff0c;这是一个与.NET Framework 4.x完全不同的框架。 这在社区引发了…

hibernate正向生成数据库表以及配置——Teacher.java

package cn.bdqn.studentInfo.entity;import java.util.HashSet; import java.util.Set;/*** 老师的实体类* author Administrator**/ public class Teacher {private Integer id;private String name;private Set<Student> students new HashSet<Student>();publi…

19年8月 字母哥 第五章 静态资源与模板引擎的整合 用热点公司网不行

第五章 静态资源与模板引擎的整合 5.1.webjars与静态资源 5.2.模板引擎选型与未来趋势 5.3.web应用开发之整合jsp 5.4.web应用开发之整合freemarker 5.5.web应用开发之整合thymeleaf 5.6.thymeleaf基础语法讲解 5.7.thymeleaf内置对象与工具类 5.8.公共片段(标签)与内联…

python 随机排序_Python 如何随机打乱列表(List)排序

场景&#xff1a;现在有一个list:[1,2,3,4,5,6]&#xff0c;我需要把这个list在输出的时候&#xff0c;是以一种随机打乱的形式输出。专业点的术语&#xff1a;将一个容器中的数据每次随机逐个遍历一遍。注意&#xff1a;不是生成一个随机的list集。环境&#xff1a;Python 3.6…

深入JVM虚拟机(四) Java GC收集器

转载自 深入JVM虚拟机(四) Java GC收集器1 GC收集器 1.1 Serial串行收集器 串行收集器主要有两个特点&#xff1a;第一&#xff0c;它仅仅使用单线程进行垃圾回收&#xff1b;第二&#xff0c;它独占式的垃圾回收。 在串行收集器进行垃圾回收时&#xff0c;Java 应用程序中的线…

JavaScript(笔记)

UI框架 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yYMMLanm-1608952213820)(C:\Users\王东梁\AppData\Roaming\Typora\typora-user-images\image-20201225142522925.png)] 简介 javaScript是一门世界上最流行的脚本语言 Java&#xff0c;Java…

19年8月 字母哥 第六章 生命周期内的拦截过滤与监听 用热点公司网不行

第六章 生命周期内的拦截过滤与监听 6.1.servlet与filter与listener的实现 servlet的filter(过滤器)listener(监听器) 6.2.spring拦截器及请求链路说明 6.3.自定义事件的发布与监听 6.4.应用启动的监听 第六章 生命周期内的拦截过滤与监听 6.1.servlet与filter与listener的…