jvm垃圾回收机制:

  jvm中有个垃圾回收线程,它是低优先级的,当虚拟机空闲或堆内存不足时,它就会去清除不可达对象。

GC是如何去判断对象是否能被回收的

  早期GC判断对象是否能被回收时用的引用计数法,后来改进成了可达性分析法。

  引用计数法:比如A引用了B它就会记录下一个1 ,同理B也去引用A。引用计数法只有在为0的时候才回收对象,像这种“相互引用,循环引用”的对象其中一个没回收都是回收不了的。

  可达性分析法:通过GCRoot去引用该对象,若不为空则不回收,为空则回收。

  gcroot对象:线程在运行状态中不允许被回收的对象。 例如:局部变量,静态变量,常量,成员变量。

Minor GC与Full GC的触发时机

  新生代内存不够用时候发生MGC也叫YGC,JVM内存不够的时候发生FGC

  Minor gc在新生代内存不够的时候触发

  Major gc在老年代内存不够的时候触发

  Full  gc在JVM内存不够的时候触发,它会清理新生代和老年代的空间。

垃圾收集器有哪些?

  (1)串行收集器:使用单线程去做,是最稳定以及高效的收集器,可能产生较长的停顿。新生代复制算法串行执行、老年代标记-压缩串行执行。
  (2)并行收集器:多线程去做。新生代复制算法并行执行、老年代标记-压缩串行执行。
  (3)CMS收集器:是一种以获取最短回收停顿时间为目标的收集器,CMS收集器是基于“标记-清除”算法实现。 
     步骤流程:
      初始标记:标记出 GC Roots 能直接关联到的对象
      并发标记:从GC Root 开始对堆中对象进行可达性分析,找出存活的对象,这阶段耗时较长,但可与用户程序并发执行
      重新标记:修正并发标记期间因用户程序导致标记产生变动的标记记录
      并发清除:清除之前标记的对象  

    (4)G1收集器:和CMS收集器一样,都是4步操作。但是G1是采用"标记-压缩"算法来实现的。
                             优点:1. 相比于CMS,它不会有空间碎片化的问题。
                                      2. 预判回收停顿时间,G1能算出最短时间内回收哪些垃圾对象的价值高。

Java对象在内存中的状态:

   可   达:   对象创建之后,能被变量引用就是可达的。

   可恢复:   对象没有引用指向时就成了可恢复状态,回收该对象之前调用finalize()进行清理,若在finalize()方法中重新被引用就会变成可达状态,反之就成为不可达状态。

   不可达:   不被引用且finalize清理时也不能重新被引用就成了不可达状态。

强引用、软引用、弱引用、虚引用以及他们之间和gc的关系

    强引用:指向通过new得到的内存空间的引用叫强引用,只要强引用还在,它宁愿out of memory内存溢出也不会回收。

    弱引用:通过weakReference类来实现,不管内存是否充足都会回收.

    软引用:通过SoftReference类来实现,内存溢出之前,回收

    虚引用:虚引用通过PhantomRefence类实现,如果一个对象与虚引用关联,则跟没有引用与之关联一样,在任何时候都可能被垃圾回收器回收。

常见的GC回收算法:

  引用计数法:给对象添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;计数器值为0的对象就是不再被使用的,垃圾收集器将回收该对象,若频繁被使用就将对象放到老年代中。

    特点:执行速度比较快。但是"互相引用,循环引用"的对象却会都无法回收。(正是由于这个缺陷,这个算法不再被使用)

  复制回收算法:用在新生代中;新生代中分为 eden  s0  s1 三个区域,默认比例为8:1:1。我们创建对象时,对象存在eden区,当eden区块满时,就会触发GC将经常使用的对象放到s0区,如此反复当s0快满的时候,就将经常使用且存活的对象放入s1区,将s0中不可达的对象清理掉,下次eden区再有对象要移出来的时候就直接放到s1区。而s1快满的时候就会将常用且存活的对象放到s0区,其余的对象全部清理掉。当新生代的空间耗尽时,就会把经常使用的对象转移到老年代中。

    特点:保证数据最大限度的停留在新生代中,新生代内存空间利用率达到90%。

  标记-清除算法:根据特定的算法(如:引用计数算法,可达性分析算法等)标出内存中哪些对象可以回收,哪些对象还要继续用。标记指示回收,那就直接收掉;标记指示对象还能用,那就原地不动留下。

    特点:标记与清除没有连续性效率低下,清除之后内存会产生大量碎片。

  标记-压缩算法:用在老年代中;就是基于标记清除算法之上做的优化,把存活的对象压缩到内存一端,而后进行垃圾清理。不会造成内存碎片化!

    

三:GC回收机制的更多相关文章

  1. Goland的GC回收机制

    Goland的GC回收机制 GC触发的条件 阈值:默认内存扩大一倍,启动gc 定期:默认2min触发一次gc,src/runtime/proc.go:forcegcperiod 手动:runtime. ...

  2. JVM组成、GC回收机制、算法、JVM常见启动参数、JAVA出现OOM,如何解决、tomcat优化方法

    JVM组成.GC回收机制.算法.JVM常见启动参数.JAVA出现OOM,如何解决.tomcat优化方法

  3. Java GC回收机制

    优秀Java程序员必须了解的GC工作原理 一个优秀的Java程序员必须了解GC的工作原理.如何优化GC的性能.如何与GC进行有限的交互,因为有一些应用程序对性能要求较高,例如嵌入式系统.实时系统等,只 ...

  4. java GC 回收机制 转

    JVM分代垃圾回收策略的基础概念 由于不同对象的生命周期不一样,因此在JVM的垃圾回收策略中有分代这一策略.本文介绍了分代策略的目标,如何分代,以及垃圾回收的触发因素. 文章总结了JVM垃圾回收策略为 ...

  5. python三种回收机制

    Python的GC模块主要运用了“引用计数”(reference counting)来跟踪和回收垃圾.在引用计数的基础上,还可以通过“标记-清除”(mark and sweep)解决容器对象可能产生的 ...

  6. java内存管理和gc回收机制

    Java垃圾回收概况 Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者,一般不需要专门编写内存回收和垃圾清理代码 ...

  7. jvm gc回收机制

    jdk8取消永久代,增加metaspace元空间.使用本地内存,不使用堆内存. jstat -gcutil jstat -gccause pid 1 每格1毫秒输出结果jstat -gccause p ...

  8. 定义类+类实例化+属性+构造函数+匿名类型var+堆与栈+GC回收机制+值类型与引用类型

    为了让编程更加清晰,把程序中的功能进行模块化划分,每个模块提供特定的功能,而且每个模块都是孤立的,这种模块化编程提供了非常大的多样性,大大增加了重用代码的机会. 面向对象编程也叫做OOP编程 简单来说 ...

  9. python 之gc(回收机制)--garbage collection(GC垃圾回收)

    ######################引用计数######################### 引用计数:python 当中一种用来解决垃圾回收的策略之一 char 1个字节(2**8) in ...

随机推荐

  1. QLCDNumber

    继承于  QFrame 展示LCD样式的数字,它可以显示几乎任何大小的数字,它可以显示十进制,十六进制,八进制或二进制数 能够展示的字符: 0/O, 1, 2, 3, 4, 5/S, 6, 7, 8, ...

  2. vue-cli3热更新配置,解决热更新失败的问题,保存代码浏览器自动刷新

    在vue,config.js中配置css热更新 const IS_PROD = ['production', 'test'].includes(process.env.NODE_ENV) css: { ...

  3. CSS定位机制之浮动定位float

    一.浮动定位实现的效果 二.使用float实现浮动定位 三.使用clear属性清除浮动定位 四.浮动定位的应用(布局) 一.浮动定位实现的效果   (一).块元素(div)在文档流中默认垂直排列,如果 ...

  4. sh_09_格式化输出

    sh_09_格式化输出 # 定义字符串变量 name,输出 我的名字叫 小明,请多多关照! name = "大小明" print("我的名字叫 %s,请多多关照!&quo ...

  5. OpenCV feature2d

    /*M/////////////////////////////////////////////////////////////////////////////////////// // // IMP ...

  6. ubuntu18.04设置静态IP

    ubuntu18与ubuntu14.16设置静态ip地方方法不同,很多人没去读更新文档的时候往往会设置静态ip地址不成功,下面是具体的设置方法 做之前一定要确认自己操作系统的版本,每个版本设置的方法有 ...

  7. 基于python实现自动化办公学习笔记一

    1.CSV(1)写csv文件 import csv def writecsv(path,data): with open(path, "w") as f: writer = csv ...

  8. React-Native 之 GD (十三)数据持久化(realm) 及 公共Cell

    1.数据持久化 数据持久化是移动端的一个重要部分,刚发现 Realm 原来已经支持 React-Native 了 步骤一: 引入 realm $ npm install realm --save 步骤 ...

  9. node.js运行配置(vs code非控制台输出)

    node.js运行配置(vs code非控制台输出) node  配置 简化  vs code 是非常强大的编译器,皆因它有有各种各样好用的插件. 在没有安装code runner插件之前,想要执行n ...

  10. [转]python常用的十进制、16进制、字符串、字节串之间的转换

    阅读目录(Content) 整数之间的进制转换: 字符串转整数: 字节串转整数: 整数转字节串: 字符串转字节串: 字节串转字符串: 测试用的python源码 进行协议解析时,总是会遇到各种各样的数据 ...