**什么是垃圾回收机制:**在系统运行过程中,会产生一些无用的对象,这些对象占据着一
定的内存,如果不对这些对象清理回收无用对象的内存,可能会导致内存的耗尽,所以垃圾
回收机制回收的是内存。同时 GC 回收的是堆区和方法区的内存。
JVM 回收特点:(stop-the-world)当要进行垃圾回收时候,不管何种 GC 算法,除了垃圾回收
的线程之外其他任何线程都将停止运行。被中断的任务将会在垃圾回收完成后恢复进行。
GC 不同算法或是 GC 调优就是减少 stop-the-world 的时间。à(为何非要 stop-the-world),就像是一个同学的聚会,地上有很多垃圾,你去打扫,边打扫边丢垃圾怎么都不可能打扫干净的哈。当在垃圾回收时候不暂停所有的程序,在垃圾回收时候有 new 一个新的对象 B,此时对象 A 是可达 B 的,但是没有来及标记就把 B 当成无用的对象给清理掉了,这就会导致程序的运行会出现错误。
如何判断哪些对象需要回收呢:
**引用计数算法(java 中不是使用此方法):**每个对象中添加一个引用计数器,当有别人
引用它的时候,计数器就会加 1,当别人不引用它的时候,计数器就会减 1,当计数器为 0
的时候对象就可以当成垃圾。算法简单,但是最大问题就是在循环引用的时候不能够正确把
对象当成垃圾。
**根搜索方法(这是后面垃圾搜集算法的基础):**这是 JVM 一般使用的算法,设立若干
了根对象,当上述若干个跟对象对某一个对象都不可达的时候,这个对象就是无用的对象。
对象所占的内存可以回收。
根搜索算法的基础上,现代虚拟机的实现当中,垃圾搜集的算法主要有三种,分别是标记- 清除算法、复制算法、标记-整理算法。
**标记-消除算法:**当堆中的有效内存被耗尽的时候,就会停止整个系统,就会调用标记- 消除算法,主要做两件事,1 就是标记,2 就是清除。然后让程序恢复。
标记:遍历所有 GCroots 把可达的对象标记为存活的对象。
清除:把未标记为存活的对象清楚掉。
缺点:
就是效率相对比较低。会导致 stop-the-world 时间过长。
因为无用的对象内存不是连续的因此清理后的内存也不是连续的,(会产生内存碎片)因此
JVM 还要维持一个空闲列表,增加一笔开销,同时在以后内存使用时候,去查找可用的内存
这个效率也是很低的。
复制算法:(这个算法一般适合在新生代 GC),将原有的内存分为两块,每次只适用其中的一块,在垃圾回收的时候,将一块正在使用的内存中存活(上述根搜索的算法)的对象复制到另
一块没有使用的内存中,原来的那一块全部清除。与上述的标记-清除算法相比效率更高,
但是不太适合使用在对象存活较多的情况下(如老年代)。
**缺点:**每次对整个半区内存回收,因此效率比上面的要高点,同时在分配内存的时候不
需要考虑内存的碎片。按照顺序分配内存。简单高效。
但是最大的问题在于此算法在对象存活率非常低的时候使用,将可用内存分为两份,每次只
使用一份这样极大浪费了内存。
注意(重要):现在的虚拟机使用复制算法来进行新生代的内存回收。因为在新生代中绝大
多数的对象都是“朝生夕亡”,所以不需要将整个内存分为两个部分,而是分为三个部分,一
块为 Eden 和两块较小的 Survivor 空间(比例->8:1:1)。每次使用 Eden 和其中的一块 Survivor,
垃圾回收时候将上述两块中存活的对象复制到另外一块 Survivor 上,同时清理上述 Eden 和
Survivor。所以每次新生代就可以使用 90%的内存。只有 10%的内存是浪费的。(不能保证每
次新生代都少于 10%的对象存活,当在垃圾回收复制时候如果一块 Survivor 不够时候,需要
老年代来分担,大对象直接进入老年代)
标记-整理算法:(老年代 GC)在存活率较高的情况下,复制的算法效率相对比较低,同时还
要考虑存活率可能为 100%的极端情况,因此又不能把内存分为两部分的复制算法。
在上面标记-复制算法的基础之上,演变出了一个新的算法就是标记-整理算法。首先从
GCroots 开始标记所有可达的对象,标记为存活的对象。然后将存活的对象压缩到内存一端
按照内存地址的次序依次排列,然后末端内存地址之后的所有内存都清除。
**总结:**将标记存活的对象按照内存地址顺序排列到内存另一端,末端内存地址之后的内
存都会被清除。
**比较:**相比较于标记-清楚算法 (传统的),该算法可以解决内存碎片问题同时还可以解
决复制算法部分内存不能利用的问题。但是标记-整理算法的效率也不是很高。
->上述算法都是根据根节点搜索算法来判断一个对象是不是需要回收,而支撑根节点搜索算
法能够正常工作理论依据就是语法中变量作用域的相关内容。
三种算法比较:
**效率:**复制算法>标记-整理算法>标记-清除算法;
**内存整齐度:**复制算法=标记-整理算法>标记-清除算法
**内存利用率:**标记-整理算法=标记-清除算法>复制算法
分代收集算法:现在使用的 Java 虚拟机并不是只是使用一种内存回收机制,而是分代收集的算法。就是将
内存根据对象存活的周期划分为几块。一般是把堆分为新生代、和老年代。短命对象存放在
新生代中,长命对象放在老年代中。
对于不同的代,采用不同的收集算法:
**新生代:**由于存活的对象相对比较少,因此可以采用复制算法该算法效率比较快。
**老年代:**由于存活的对象比较多哈,可以采用标记-清除算法或是标记-整理算法
(注意)新生态由于根据统计可能有 98%对象存活时间很短因此将内存分为一块比较大的
Eden 空间和两块较小的 Survivor 空间,每次使用 Eden 和其中一块 Survivor。当回收时,将
Eden 和 Survivor 中还存活着的对象一次性地复制到另外一块 Survivor 空间上,最后清理掉
Eden 和刚才用过的 Survivor 空间。
上述是垃圾回收机制的算法,但是垃圾回收器才是垃圾回收的具体实现:
常见有五个垃圾回收器:
一:串行收集器:(Serial 收集器)
该收集器最古老、稳定简单是一个单线程的收集器,(stop-the-world)可能会产生长时间
的停顿. serial 收集器一定不能用于服务器端。这个收集器类型仅应用于单核 CPU 桌面电脑。
新生代和老年代都会使用 serial 收集器。新生代使用复制算法(内存分三块的那个复制算法)。
老年代使用标记-整理算法。
二:并行收集器:(Parallel 收集器)
parallel 收集器使用多线程并行处理 GC,因此更快。当有足够大的内存和大量芯数时,parallel
收集器是有用的。它也被称为“吞吐量优先垃圾收集器。” 三:并行收集器:(Parallel Old 垃圾收集器)
相比于 parallel 收集器,他们的唯一区别就是在老年代所执行的 GC 算法的不同。它执行三
个步骤:标记-汇总-压缩(mark – summary – compaction)。汇总步骤与清理的不同之处在
于,其将依然幸存的对象分发到 GC 预先处理好的不同区域,算法相对清理来说略微复杂一
点。
四:并行收集器:(CMS 收集器)
(ConcurrentMark Sweep:并发标记清除)是一种以获取最短回收停顿时间为目标的收集器。
适合应用在互联网站或者 B/S 系统的服务器上,这类应用尤其重视服务器的响应速度,希望
系统停顿时间最短。五:G1 收集器
这个类型的垃圾收集算法是为了替代 CMS 收集器而被创建的,因为 CMS 收集器在长时间
持续运行时会产生很多问题。

java面试之简述一下 Java 垃圾回收机制?相关推荐

  1. 前端面试查漏补缺--(二) 垃圾回收机制

    前言 本系列最开始是为了自己面试准备的.后来发现整理越来越多,差不多有十二万字符,最后决定还是分享出来给大家. 为了分享整理出来,花费了自己大量的时间,起码是只自己用的三倍时间.如果喜欢的话,欢迎收藏 ...

  2. java清空字符串_java面向对象,垃圾回收机制

    一.类的属性 属性用于定义该类或该类对象包含的数据或者说静态特征.属性作用范围是整个类体. 在定义成员变量时可以对其初始化,如果不对其初始化,Java使用默认的值对其初始化. 二.UML图 三.类和对 ...

  3. JVM内存区域(Java内存区域)、JVM垃圾回收机制(GC)初探

    一.JVM内存区域(Java内存区域) 首先区分一下JVM内存区域(Java内存区域)和Java内存模型(JMM)的概念.Java线程之间的通信采用的是共享内存模型,这里提到的共享内存模型指的就是Ja ...

  4. 前端面试常考题:JS垃圾回收机制

    摘要:众所周知,应用程序在运行过程中需要占用一定的内存空间,且在运行过后就必须将不再用到的内存释放掉,否则就会出现下图中内存的占用持续升高的情况,一方面会影响程序的运行速度,另一方面严重的话则会导致整 ...

  5. a byte of python中文版_面试官问 Python 版 “垃圾回收”机制,我没答上来

    点击"开发者技术前线",选择"星标?" 13:21 在看|星标|留言,  真爱 选自<萌萌哒的柯基> 作者:heroyfhttps://www.he ...

  6. java年轻代_Java分代垃圾回收机制:年轻代/年老代/持久代(转)

    虚拟机中的共划分为三个代:年轻代(Young Generation).年老点(Old Generation)和持久代(Permanent Generation).其中持久代主要存放的是Java类的类信 ...

  7. Java工程师必备:JVM原理、内存模型、调优、垃圾回收机制、面试题

    在如今这个时间和知识都是碎片化的时代,C站根据C1-C4认证的成长路径,进行知识细化整理,形成系统化的知识图谱. 通过调研一线互联网大厂的招聘JD,小编对标C站能力认证要求,为大家整理了系列技术干货合 ...

  8. 深入浅出Java垃圾回收机制

    2019独角兽企业重金招聘Python工程师标准>>> 对于Java开发人员来说,了解垃圾回收机制(GC)有哪些好处呢?首先可以满足作为一名软件工程师的求知欲,其次,深入了解GC如何 ...

  9. 成为JavaGC专家(1)—深入浅出Java垃圾回收机制

    2019独角兽企业重金招聘Python工程师标准>>> 对于Java开发人员来说,了解垃圾回收机制(GC)有哪些好处呢?首先可以满足作为一名软件工程师的求知欲,其次,深入了解GC如何 ...

  10. 【Java 虚拟机原理】垃圾回收算法 ( Java 虚拟机内存分区 | 垃圾回收机制 | 引用计数器算法 | 引用计数循环引用弊端 )

    文章目录 一.Java 虚拟机内存分区 二.垃圾回收机制 三.引用计数器算法 ( 无法解决循环引用问题 ) 一.Java 虚拟机内存分区 Java 虚拟机内存分区 : 所有线程共有的内存区域 : 堆 ...

最新文章

  1. 2013大数据全球技术峰会观后感
  2. 设计模式=相似模式区别
  3. 白话Elasticsearch46-深入聚合数据分析之Cardinality Aggs-cardinality去重算法以及每月销售品牌数量统计
  4. python123编写函数求和_Python基础之函数
  5. gdb调试常用命令速查(段错误调试)
  6. Joe博客模板Typecho主题
  7. Filter(过滤器)、Listener(监听器)
  8. pythonread读取怎么是乱码_python中如何读写文件不乱码
  9. 如何解决mysql数据倾斜_什么是数据倾斜?如何解决数据倾斜?
  10. linux服务器安装nexus,Linux下搭建maven服务器nexus
  11. matplotlib—matplotlib绘图中出现□的解决办法
  12. 如何使用 FFMpeg 在 Node.js 中将音频从 Wav 转换为 MP3
  13. 远程桌面控制软件Teamviewer免费版安装
  14. 判断丑数python_263. 丑数(Python)
  15. [机缘参悟-64]:《兵者,诡道也》-5-三十六计解读-混战计
  16. Packet Sniffing and Spoofing Lab(报文嗅探欺骗SEED 实验)
  17. leetcode-回溯
  18. 使用opencv.js分类器和hbuilderx开发一个分类器app
  19. MAC修改主机名、计算机名
  20. 从虚拟光驱启动计算机,手把手教你使用win10/win8自带的”虚拟光驱“(资源管理器)挂载打开ISO镜像文件-系统操作与应用 -亦是美网络...

热门文章

  1. 产品经理入门知识梳理(含思维导图
  2. python PDF文件转JPG
  3. 2017 idea 代码字体加粗
  4. 用python处理DEA模型--CCR
  5. 红旗服务器安装Tuxedo中间件
  6. 眼动数据分析基础_数据处理
  7. Oracle基础视频教程
  8. 虚拟机xp系统联网问题
  9. 计算机二级公共基础知识个人整理
  10. JDK:native2ascii命令详解