为什么分代算法: 90%对象熬不过第一次回收;而老对象有98%的概率会一直存活下来

分代好处:把复杂的大问题,分成两类不同的小问题,针对不同的小问题,针对性的分而治之

--年轻代,对象来去频繁,执行时间一定要短、效率要高,采用标记-整理、copy算法,以空间换时间, 默认比例:8:1

--老年代,对象不多,次数不频繁,采用内存使用比较高效的算法

G1垃圾回收器, 是JDK7的特性, garbage first,即优先处理垃圾多的内存块

--G1将内存划分成很多小块,每个小块会被标记为E/S/O中的一个(共三大类,不在泾渭分明)

--垃圾回收过程:

---先短暂停止应用-stop the world 做初始标志

---继续应用,开始并行标记-concurrent mark

---再次停止应用,进行final mark 标记并发标记过程中产生的新垃圾

---根据G1原则,选择部分内存片进行回收-stop the world

G1的一个显著特点就是用户设置暂停时间,G1能够做到的原因:G1的第4步,是选择一些内存块,而不是整代内存回收(其他GC都是回收整个generation的内存,而回收内存所需的时间取决于内存的大小,以及实际的垃圾大小,所有回收时间是不可控的),而G1每次不回收整代内存,到底回收多少依赖用户配置的时间,配置的时间短就少回收点,配置的时间长就多回收点,伸缩自如。

优点:内存分成多块,进行内存整理和压缩的代价比较小,可有效规避内存碎片的问题

缺点:如果内存吃紧,对内存的部分回收根本不够,仍需要整代回收,那么工作量一点没有减少,还有因为本身算法复杂,回收性能变差

-G1适合内存稍大一点的应用(一般来说至少4G以上),小内存的应用还是用传统的垃圾回收器比如CMS比较合适

-G1最显著与CMS的,在于它对空间做了整理,减少了空间的碎片化

G1可以基本稳定在0.5S到1S左右的延迟

GC的一些建议:

1. 尽早释放无用对象的引用,大多是使用临时变量时,都是让引用变量退出活动域后,自动设置为null,如果程序运行,尽早将引用对象赋为null,加速gc工作;

2. 尽量少用finalize函数: 为支持finalize函数,GC额外做了大量工作;finalize后,对象仍有可能可达,使用finalize会降低GC运行性能;GC调用finalize的时间是不确定的,通过这种方式释放资源也是不确定的; (当对象变成(GC Roots)不可达时,GC会判断该对象是否覆盖了finalize方法,若未覆盖,则直接将其回收。否则,若对象未执行过finalize方法,将其放入F-Queue队列,由一低优先级线程执行该队列中对象的finalize方法。执行finalize方法完毕后,GC会再次判断该对象是否可达,若不可达,则进行回收,否则,对象“复活”)

3. 如果经常使用图片,可以使用soft应用,能够尽可能将图片保持在内存中,供程序调用,而不引起OutOfMemory

4. 集合数据类型的回收更为复杂,还需要注意全局变量,以及一些静态变量,容易引起悬挂对象,造成资源浪费

5. 手动执行System.gc(),通知GC运行,但是java规范并不保证GC一定会执行,可使用增量式GC缩短暂停时间

(增量式GC就是通过一定的回收算法,把一个长时间的中断,划分为很多个小的中断,通过这种方式减少GC对用户程序的影响。虽然,增量式GC在整体性能上可能不如普通GC的效率高,但是它能够减少程序的最长停顿时间。 )

GC调优指标:

程序的吞吐量,GC对程序效率的影响,也就是花费在GC的时间和程序处理正常业务的时间比

GC吞吐量: 单位时间内垃圾回收梳理

暂停时间: Stop the world的时间, STW

GC常用算法

标记-清除:不需要挪动位置,但会产生碎片,效率也比较低-所有对象标记阶段遍历一遍,清除阶段扫描一遍

标记-压缩(整理):是标记清除的改进版,对所有存活对象整理,剩余对象清除。 不会产生碎片,但是整理阶段较多复制操作,算法效率低

复制:内存分成两部分,素有存活队形复制到另一个内存中;不产生碎片,内存浪费

分代: 新生代和老年代, 见参考文献-【JAVA核心】Java GC机制详解

垃圾回收g1java_java垃圾回收-G1相关推荐

  1. JVM学习笔记(二):垃圾回收、垃圾回收算法、垃圾回收器(Serial、Parallel、CMC、G1)、内存分配原则实战

    垃圾回收 一.判断对象是否可以被回收 1.引用计数计数法 内容:在对象中添加一个引用计数器,每当有一个地方引用它,计数器就加一:当引用失效时,计数器就减一:任何时刻计数器为零的对象都是不可能在被使用的 ...

  2. 主要垃圾回收器和垃圾回收算法

    垃圾回收算法: 标记清除算法 mark-sweep 分为标记和清除两个阶段,但是内存碎片化严重 复制算法 copying 为了解决内存碎片化问题,但是空间利用率降低,主要用于大量对象存活时间短的年轻代 ...

  3. JVM学习笔记之-拉圾回收概述,垃圾回收相关算法

    拉圾回收概述 什么是垃圾 垃圾收集,不是Java语言的伴生产物.早在1960年,第一门开始使用内存动态分配和垃圾收集技术的Lisp语言诞生. 关于垃圾收集有三个经典问题: 哪些内存需要回收? 什么时候 ...

  4. 记录java对象修改过的字段_Java垃圾回收器与内存回收策略

    Java中,内存由虚拟机管理,控制着回收什么,什么时候回收,怎么回收. 在栈中内存的随线程产生和分配,销毁而回收,在堆中,需要制定一系列策略来判断该回收哪些区域,以及何时回收. 可达性分析 主流的做法 ...

  5. java 垃圾回收之垃圾回收器篇

    java 垃圾回收之垃圾回收器篇 一,垃圾回收器的分类与性能指标 GC分类 按线程数分(垃圾回收线程数 :可以分为串行垃圾回收器和并行垃圾回收器 串行回收指的是在同一时间段内只允许有一个CPU用于执行 ...

  6. 深入理解java虚拟机之——垃圾回收(垃圾判断,垃圾收集算法,垃圾收集器)

    java与C++之间有一道动态内存分配和垃圾收集的"墙",墙里面的人想出来,墙外边的人想进去,或许只有骑在墙上才能清楚的了解,墙内墙外都是牢笼. 上面一句出自<深入理解jav ...

  7. JVM垃圾回收系列--垃圾回收器的详解/对比

    原文网址:JVM垃圾回收系列--Java垃圾回收器的详解/对比_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Java的垃圾回收器,包括:JDK默认的垃圾回收器.CMS与G1的区别.年轻代回收器.老 ...

  8. java list clear 垃圾回收_java垃圾回收机制

    1.什么是垃圾回收? 程序的运行必然需要申请内存资源,无效的对象资源如果不及时处理就会一直占有内存资源,最终将导数内存溢出,所以内存资源的管是非常重要了. 1.1.C/C++语言的垃圾回收 在C/C+ ...

  9. 常见的垃圾回收器及垃圾回收算法

    我们知道,java为了让程序员更专注于代码的实现,而不用过多的考虑内存释放的问题,采用了自动的垃圾回收机制,也就是我们熟悉的GC. 有了垃圾回收机制后,程序员只需要关心内存的申请即可,内存的释放由系统 ...

最新文章

  1. linux下压缩并分割稀疏文件
  2. VBA在EXCEL中创建图形线条
  3. sql查table,VIEW,sp, function 及 trigger 物件
  4. 为什么逻辑思维不做小程序了而开发APP得到
  5. Django 3.2.5博客开发教程:URL与视图函数
  6. Python模拟Linux/Mac OS工具grep和Windows工具findstr
  7. js 获取昨天,今天,本周,上周,季度等时间范围(封装的js)
  8. Vue.js 组件编码规范
  9. 苹果新功能惹众怒,4000多家组织和个人签署公开信 敦促苹果放弃“儿童安全”功能...
  10. 计算机在车联网的应用,刘小洋, 伍民友. 车联网: 物联网在城市交通网络中的应用[J]. 计算机应用, 2012, 32(4): 900-904....
  11. 烤烟发病叶片高光谱特征分析
  12. 基因表达式编程的任务指派问题求解算法设计与实现
  13. Buddy/Sponsor培训•信任的构建
  14. linux命令man ls,linux 命令ls man手册的详解
  15. CSS 设置文字间距
  16. 电子书寻找方法汇总2
  17. 6.网络安全渗透测试—[信息收集篇6]—[Email信息收集]
  18. 导航栏: UINavigationBar用法
  19. 学习Redis的正确姿势,有这一篇就够了
  20. Android开发初体验

热门文章

  1. 违规私募基金清查启动
  2. html下拉菜单怎么浮起来,CSS悬浮下拉菜单
  3. 设置VSCO的 - prettier
  4. mysql8.0 设置简单密码报错ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
  5. QUERY 1:制作扩展字段
  6. 2019年中AI趋势盘点
  7. 第4章 SQL SELECT 语句教程
  8. 有关于信号的超前与滞后问题
  9. Day33.爬虫基础之PyQuery
  10. 网络舆情事件的监测跟踪方案