听说微信搜索《Java鱼仔》会变更强哦!

本文收录于JavaStarter ,里面有我完整的Java系列文章,学习或面试都可以看看哦

(一)关于垃圾回收

JAVA的垃圾回收需要完成三件事情:

1、哪些内存需要回收

2、什么时候回收

3、如何回收

下面就从这三个问题出发去了解Java的垃圾回收机制。

(二)哪些垃圾需要回收

在垃圾回收之前,首要的问题是确定哪些垃圾需要被回收,现在Java通过根搜索算法(GC Roots Tracing)来判断一个对象是否存活,这个算法的思路就是通过一系列名为“GC Roots”的对象作为起始点,从这些节点向下搜索,当GC Roots到达不了这个某个对象时(或者说某个对象没有被任何其他对象所引用),就证明这个对象是不可用的,这些对象会被判定为需要回收的对象。

如图,ObjC是不可达的,这个对象就是需要被回收的对象。

在Java语言中,可作为GC Roots的对象包括下面这些:

1、虚拟机栈(栈帧中的本地变量表)中引用的对象

2、方法区中的类静态属性引用的对象

3、方法区中的常量引用的对象

4、本地方法栈(Native方法)引用的对象

(三)什么时候回收

关于如何回收的问题,我参考了《深入理解Java虚拟机》,根搜索算法中不可达的对象,并不是立刻就会被回收,而是会经过一次标记:

如果对象没有覆盖finalize()方法,或者finalize()方法已经被调用,虚拟机会判定这个对象没必要执行finalize(),在这一次标记中该对象不会被回收。

如果这个对象被标记为有必要执行finalize()方法时,它会被放置在一个名为F-Queue的队列中,稍后由虚拟机进行垃圾回收。

但是这个对象还有最后一次逃脱的机会,当在F-Queue时,虚拟机会对F-Queue中的对象作小规模的标记,如果发现此时某个对象又可达了,就会逃过GC的命运。

(四)如何回收

如何回收垃圾的问题归根结底就是垃圾回收算法如何回收垃圾的问题。这里主要介绍三种垃圾回收算法的执行思路:

4.1 标记-清除算法(Mark-Sweep)

这种算法分为标记和清除两个阶段,首先标记出所有需要回收的对象,在标记完成后统一回收掉被标记的对象。

看图就可以明白了,这个算法的问题在于,清除之后会产生大量不连续的空间碎片。

4.2 复制算法(Copying)

复制算法将内存分为两块,每次使用其中一块,垃圾回收时,将正在使用的那块内存中存活的内存放入另一块内存中,然后清空原内存块,图示图下:

复制算法被广泛应用于新生代的垃圾回收,由于新生代的对象有百分之98左右都是要被回收的,因此新生代的内存会被分为一块Eden空间和两块Survivor空间,比例为8:1:1。

第一次YGC只回收eden区域,回收后大多数(百分之九十八左右)的对象会被回收,活着的对象通过复制算法进入Survivor0(后续用S0和S1代替)。再次YGC后,eden+S0中活着的对象进入S1。再次YGC,eden+S1中活着的对象进入到S0。依次循环

4.3 标记-整理(Mark-Compact)

标记-整理算法分为标记、整理、清除三步,第一步也是标记出可回收的对象,然后让存活的对象移到一边,然后直接清理掉边界外的垃圾。

标记整理算法被广泛应用于老年代的垃圾回收。

(五)何时触发YoungGC或FullGC

YoungGC的触发时常在发生,当新生代的Eden区满了之后就会触发YoungGC。

FullGC在多个情况下都会被触发:

1、发生Young GC之前进行检查,如果“老年代可用的连续内存空间” < “新生代历次Young GC后升入老年代的对象总和的平均大小”,说明本次Young GC后可能升入老年代的对象大小,可能超过了老年代当前可用内存空间,此时会触发FullGC

2、当老年代没有足够空间存放对象时,会触发一次FullGC

3、如果元空间区域的内存达到了所设定的阈值-XX:MetaspaceSize=,也会触发FullGC。

java垃圾回收的具体时间_JVM垃圾回收机制是怎样的,何时触发YoungGC或FullGC操作?...相关推荐

  1. JAVA确保垃圾回收后结束程序_Java垃圾回收机制(转)

    1. 垃圾回收的意义 在C++中,对象所占的内存在程序结束运行之前一直被占用,在明确释放之前不能分配给其它对象:而在Java中,当没有对象引用指向原先分配给某个对象的内存时,该内存便成为垃圾.JVM的 ...

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

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

  3. Java面试官最爱问的垃圾回收机制,这位阿里P7大佬分析总结的属实到位

    可达性分析算法:判断对象的引用链是否可达 可达性分析算法是通过判断对象的引用链是否可达来决定对象是否可以被回收. 可达性分析算法是从离散数学中的图论引入的,程序把所有的引用关系看作一张图,通过一系列的 ...

  4. java回收策略_Java 中的垃圾回收策略

    垃圾回收需要解决的问题 谁需要被回收 什么时候回收 怎么回收 谁需要被回收 如果一个对象再也不会被用到,就可以回收它了,所以关键在于如何知道一个对象再也不被使用了. 引用计数 当一个对象被引用时,引用 ...

  5. java 指定垃g1圾收集_java垃圾回收G1收集器

    G1(Garbage First)收集器是当今收集器技术发展的最前沿成果之一,他是一款面向服务端的垃圾收集器,它的使命是(在比较长期的)未来可以替换掉CMS收集器.它的特点如下: 1.并行与并发:G1 ...

  6. java简述垃圾回收原理及算法_Java垃圾回收原理和算法

    ·内存管理 Java的内存管理很大程度指的就是对象的管理,其中包括对象空间的分配和释放. 对象空间的分配:使用new关键字创建对象即可 对象空间的释放:将对象赋值null即可.垃圾回收器将负责回收所有 ...

  7. Java GC系列(4):垃圾回收监视和分析

    转载自  Java GC系列(4):垃圾回收监视和分析 在这个Java GC系列教程中,让我们学习用于垃圾回收监视和分析的工具.然后,选用一种工具来监视一个Java示例程序的垃圾回收过程.如果你是一名 ...

  8. 垃圾回收器如何确定哪些对象要回收---《深入理解java虚拟机》

    2019独角兽企业重金招聘Python工程师标准>>> 垃圾回收器如何确定哪些对象要回收: 引用计数法 很多教科书判断对象是否存活的算法是这样的:给对象添加一个引用计数器,每当有一个 ...

  9. Java进阶之深入理解对象与垃圾回收机制常见面试题

    内存泄漏和内存溢出辨析 内存溢出:实实在在的内存空间不足导致: 内存泄漏:该释放的对象没有释放,多见于自己使用容器保存元素的情况下. 常量池与String 常量池 常量池有很多说法,包括运行时常量池. ...

  10. 虚拟机:请问我刚刚回收的对象是干垃圾还是湿垃圾?|文末送书

    Java的一大特色就是支持自动垃圾回收(GC),每一个Java开发人员都需要了解虚拟机的垃圾回收机制,本文,就来介绍下如何通过虚拟机的GC日志了解垃圾回收的情况. 最简单的一个GC参数是-XX:+Pr ...

最新文章

  1. Generative Adversarial Text to Image Synthesis --- 根据文字描述生成对应的图片
  2. matlab messagebox函数,[MATLAB]在C#中引用MATLAB函数
  3. c语言笔试题(带答案)
  4. SQL Server 2005 Express
  5. vim调试Shell脚本: unexpected EOF while looking for matching
  6. KVM的内存气球技术(balloon)
  7. elementUi Dialog 对话框使用中数据获取问题
  8. 怎么看android底层源码,Android底层有必定的认识,研究过相关的Android源码
  9. 从template到DOM(Vue.js源码角度看内部运行机制)
  10. Subversion 安装文件及操作手册
  11. 编译OpenJDK8:configure error /usr/lib64/ccache/gcc is a symbolic link to ccache
  12. step7-micro/win 在win10系统下安装步骤
  13. linux查看进程和端口信息的命令
  14. 《微信小程序七日谈》- 第七天:不要捡了芝麻丢了西瓜
  15. vue3+aplayer+歌曲信息获取
  16. 无法被计算机取代的工作,机器人无法取代的职业有哪些
  17. 邮箱验证-正则表达式
  18. Python趣味编程(一)破解刘谦的“读心术”(原创)
  19. 浪潮服务器安装xp系统,浪潮ERP软件安装xp操作系统的电脑无法互相访问的解决方案 | 浪潮888博客...
  20. 双城记:云和恩墨三场精彩活动已就绪

热门文章

  1. 网页动态背景:随鼠标线条变动
  2. NTP授时服务器(网络校时服务器)对医院信息化建设的重要
  3. 《知乎周刊:读书这件小事》摘记及书评
  4. 最简单的视频编码器:基于libx265(编码YUV为H.265)
  5. STM32工程,Keil软件新建工程详细步骤
  6. Freeradius认证
  7. Java生成随机数的方法
  8. mysql导入access2016_将 Access 2.0 和 Access 95 数据库导入到当前版本
  9. 数据库:简述对数据库的认识
  10. html实现点击下载文件