java虚拟机的生命周期:

启动一个java程序时,一个虚拟机实例开始诞生,程序关闭的时候,虚拟机实例也随之消亡。

1.标记-清理算法

第一步:发生垃圾清理操作时,将可以被回收的对象进行标记处理。
第二步:回收第一步中标记的对象所占的空间。

优点:算法简单。
缺点:内存碎片化严重,后续可能会发生大对象找不到可以存放的空间问题。

2.复制算法

将内存分为大小相同的两块,每次只用其中的一块;当使用的这块内存存满后,将其中还存活的对象复制到另一块内存中,再将之前那块内存进行清理操作。

优点:不容易产生内存碎片。
缺点:内存被压缩到了原来的一半,如果存活对象比较多的话,复制算法效率会下降。

3.标记-整理算法:

该算法综合了上面两种算法:

第一阶段:将需要清除的对象进行标记。
第二阶段:将存活的的对象(未被标记的)向内存的一端进行移动,移动完毕后,清除剩下的内存空间。

4.分代收集算法:

该算法是目前大部分JVM所采用的的一种垃圾回收算法。

新生代
一般新生代会划分为一块较大的Eden空间和两块较小的Survivor空间,每次使用Eden空间和其中的一块Survivor空间。

Eden空间比Survivor0Survivor1空间大,这是因为在新生代中大部分的对象被创建后很快就会被GC,所以Survivor空间不用分配太多的空间。

老生代
在新生代中经历了N次垃圾回收后仍然存活的对象,就会被放到老生代中。
因此,可以认为老生代中存放的都是一些生命周期较长的对象。所以在老生代中一般所采取的垃圾回收算法是标记-整理算法。

当进行回收时,将Eden空间和Survivor0空间中还存活的对象复制到另一块Survivor1空间中,
然后清除Eden和Survivor0的空间,之后就使用Eden和Survivor1这两块空间。当进行下一次垃圾回收时,将Eden和Survivor1的空间还存活的对象复制到Survivor0,然后清除Eden和Survivor1的空间。 以此类推,每次总有一个Survivor空间是空的。
当然,如果目标Survivor空间无法存储Eden和Survivor存活的所有对象时,会将这些对象存储到老生代。
当对象中Survivor区躲过一次GC时,其年龄就会加1,当到达一定的年龄后,会将其移动到老生代。根据对象的生命周期,将内存空间划分为新生代和老生代;每次垃圾回收新生代大部分对象被回收老生代少部分对象被回收。

5.引用计数算法:

给对象增加一个计数器,对象每被引用一次,计数器+1,计数器数值越大说明对象引用越频繁。

优点:算法简单。
缺点:不能帮助解决相互引用对象的回收问题。

Java垃圾回收策略相关推荐

  1. JAVA之JVM分代垃圾回收策略(一)

    一.为什么要分代 分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的.因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率. 在Java程序运行的过程中,会产生大量的对 ...

  2. ReviewForJob——java虚拟机的垃圾回收策略(个人总结)

    理解jvm的垃圾回收策略,需要解决以下3个问题 问题1:哪些内存需要回收? 问题2:什么时候进行回收? 问题3:怎样来回收? [解决问题1]哪些内存需要回收? jvm的内存区域有5大块: 1)程序计数 ...

  3. java垃圾回收 分代_Java分代垃圾回收策略原理详解

    一.为什么要分代 分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的.因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率. 在Java程序运行的过程中,会产生大量的对 ...

  4. 假期三天,我肝了万字的Java垃圾回收,看完你还敢说不会?

    大家好,我是狂聊,上一篇已经把 Jvm 的运行区数据和类加载机制聊完了. 今天来说说 Java 垃圾回收,高频面试问题. 提纲附上,话不多说,直接干货 1.什么是垃圾回收? 垃圾回收(Garbage ...

  5. Java垃圾回收机制(Garbage Collection)

    引用博客地址:http://www.cnblogs.com/ywl925/p/3925637.html 以下两篇博客综合描述Java垃圾回收机制 第一篇:说的比较多,但是不详细 http://www. ...

  6. java垃圾回收机制串行_Java垃圾回收机制

    Java语言是一门自动内存管理的语言,不再需要的对象可以通过垃圾回收自动进行内存释放. Java运行时内存区域划分 JVM将Java程序运行时内存区域划分成以下几个部分: 程序计数器(Program ...

  7. java垃圾回收根对象_Java垃圾回收怎么理解?

    展开全部 Java的堆是一个运行时数据区,类的实例(对象)从中62616964757a686964616fe58685e5aeb931333339653664分配空间.Java虚拟机(JVM)的堆中储 ...

  8. Java垃圾回收(GC)机制详解

    Java垃圾回收(GC)机制详解 转自:https://www.cnblogs.com/xiaoxi/p/6486852.html 一.为什么需要垃圾回收 如果不进行垃圾回收,内存迟早都会被消耗空,因 ...

  9. IBM Java垃圾回收

    垃圾回收策略,第1部分 垃圾回收策略,第2部分 出色的"清洁工具"--理解IBM Java垃圾回收器,第1部分:对象分配 出色的"清洁工具"--理解IBM Ja ...

最新文章

  1. 卷积神经网络模型如何辨识裸体图片
  2. python中output使用_python-02.输入Input/输出Output
  3. 跳出所有循环的语句_从零开始的Java之旅2.0 流程控制语句
  4. Java 128陷阱+自动装箱拆箱
  5. 编程技术越来越被看中 编程到底是什么?赶紧看看!
  6. mysql binlog 日志
  7. Python:使用正则去除HTML标签(转)
  8. python---numpy简单用法
  9. 系统学习深度学习(三十)--BiLSTM
  10. LeetCode 1——两数之和
  11. [原创]如何免费使用宝塔专业版
  12. 美标AWG与国标MM线径、电流换算对照表
  13. windows资源监视器
  14. 模拟电视原理(笔记)
  15. 计算机没有光驱降无法启动,windows 未能启动 原因可能是最近更改了硬件或软件 没有光驱怎么办...
  16. 通道注意力机制keras_注意力机制及Keras实现
  17. 医院挂号小程序,预约挂号小程序,微信小程序医院预约挂号系统毕业设计作品
  18. 使用openssl命令 生成指定有效时间的ssl证书,cer格式
  19. [深入浅出C语言]理解取整、取余和取模
  20. 解决:Eclipse new java working set没反应

热门文章

  1. Mac PHP7.4安装
  2. [控制原理基础]浅谈PID算法
  3. 网络协议之:基于 UDP 的高速数据传输协议 UDT
  4. 双系统下卸载Ubuntu方法
  5. 16ava基础---Lambda,Stream流编程题
  6. python 圆周率代码_基于Python计算圆周率pi代码实例
  7. infiniband rmmod: ERROR: Module xxxx is in use by:yyyyy
  8. 去除spire.doc去水印
  9. 关于scanf函数返回值被忽略的解决方法
  10. 我们分析了GitHub上5.46 亿条日志,发现中国开源虽然贡献大但还有这些不足......