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. 关于本地使用antd的upload组件上传文件,ngnix报错405的问题

    使用阿里的ui框架antd的upload,会自动请求ngnix上面的一个路径,也就是action所在的位置,一直报错405 not allowed,后来经讨论,统一将action写成一个路径,后端对这 ...

  2. Gparted for partition of Linux on graphic interface

    You can change the partition table on Linux by a group of tools, which is tool comprehansive for a n ...

  3. koa2的安装

    参考: https://www.jianshu.com/p/6b816c609669 1.1 安装koa-generator 在终端输入: $ npm install -g koa-generator ...

  4. noi 1700 + 1756 八皇后问题 x

    1700:八皇后问题 总时间限制:  10000ms 内存限制:  65536kB 描述 在国际象棋棋盘上放置八个皇后,要求每两个皇后之间不能直接吃掉对方. 输入 无输入. 输出 按给定顺序和格式输出 ...

  5. Oracle And子句

    Oracle And子句 作者:初生不惑 Oracle基础 评论:0 条 Oracle技术QQ群:175248146 在本教程中,将学习如何使用Oracle AND运算符来组合两个或更多的布尔表达式. ...

  6. sql server 高版本数据还原到低版本sql server的注意事项

    生成的sql脚本不能大于100m,否则会报错(System.OutOfMemory) 所以要将较大的sql脚本文件进行分割

  7. 【转】i18n实现前端国际化(实例)

    源地址:https://www.jianshu.com/p/ea93efef5155 i18n实现前端国际化(实例) 0.1442018.08.27 16:25:10字数 246阅读 10563 在今 ...

  8. 前端面试题-HTML结构语义化

    一.HTML语义化的背景 HTML结构语义化,是近几年才提出来的,对比之前的 HTML 结构,大多是一堆没有语义的标签.用的最多的就是 DIV+CSS,为了改变这种现状,开发者们和官方提出了 HTML ...

  9. 500 cannot be cast to javax.xml.registry.infomodel

    在使用mybatis的时候每次一调用一个返回User类型的sql时,总是会报错如下: com.xx.all.domain.User cannot be cast to javax.xml.regist ...

  10. mysql 无法远程连接 没有监听端口

    centos yum安装mysql: 远程连接完成用户授权和防火墙配置,可还是连接不上. 发现mysql没有监听3306端口. 修改mysql配置文件 vi /etc/my.conf 注释掉以下行,重 ...