垃圾回收机制:释放那些不再持有引用的对象的内存。

如何判断对象是否需要回收?

  1. 引用计数:对象,内存,磁盘空间等被引用次数保存起来,次数为0时将其进行释放。
  2. 对象引用遍历:对象应用遍历从一组对象开始,沿着对象图的每条链接,递归课到达对象,如果不能从根对象到达,则将它进行回收。

垃圾回收方法?

  1. 标记清除法:遍历对象图并记录可达对象,以便删除不可达对象,一般使用单线程工作并可能产生内存碎片,标记回收会分为“标记”、“清除”两阶段,先标记需要回收的对象,标记后统一进行清除。标记清除过程效率不高;

     

  2. 标记整理法:遍历对象图并记录可达对象,以便删除不可达对象,一般使用单线程工作并可能产生内存碎片,并将存活对象压缩到内存的一端,这样内存碎片可以合成一整块可用内存区域,提高内存利用率,缺点进行对象移动,成本较高,好处是不会产生内存碎片。

  

  3. 复制回收法:复制回收将可用内存划分为大小相等的两块,每次只是用其中一块,当这块使用完的时候,就将还存活的对象复制到另一块内存中去,然后在把已经使用过的内存空间一次性处理掉,这样使得每次都是对其中的一块进行内存回收,不会产生碎片等情况,只要移动对指针,按照顺序分配内存即可,实现简单,运行高效,缺点,内存占用多一半。

  

  4. 分代回收法:根据对象的存活周期的不同将内存划分为几块,一般将java堆分为新生代和老年代,这样就可以根据各个年代的特点采用适当的收集算法:

  新生代:垃圾回收的时候发现大批对象死去,只有少量存活,那就选用复制算法,只需要付出少量存活对象的复制成本就可以完成收集。

  老年代:对象存活率高,没有额外空间对他进行分配担保,就必须使用标记清理算法进行回收。

垃圾回收器:

serial收集器:android 2.3之前采用这个收集器进行垃圾回收,会停止所有的UI操作。单线程收集器,只会使用一个CPU或一条线程去完成工作,进行垃圾回收的时候,暂停其他工作线程,直到工作完毕。对于限定单个CPU的环境,serial收集器没有线程交互,自然高效。

parNew收集器:serial收集器的多线程版本,运行在server模式下首选的收集器,能够和CMS收集器配合工作,CMS收集器是个优秀的并发垃圾收集器,parNew能与其搭配让parNew收集器更加完美。

parallel Scavenge收集器:新生代收集器,利用复制算法进行回收,并发多线程收集器,可控制吞吐量(运行用户代码时间/(运行用户代码时间+垃圾收集时间))的收集器。可以设置最大垃圾停留时间和吞吐量大小,打开垃圾收集将根据当前系统运行状态自动调节,这种方式成为GC自适应调节策略。手工优化存在困难的时候可直接交给虚拟机去完成。

G1收集器:结合空间整合,不会产生大量碎片,降低GC频率。可明确指定停顿时间,划分优先级操作,保证效率。

CMS收集器:获取最短回收停顿时间为目标的收集器。应用于互联网B/S架构的服务器上,重视响应时间。采用标记-清除算法,效率上占用CPU资源,使得应用程序变慢,无法处理浮动垃圾;算法是会产生大量碎片,无法为大对象分配内存的时候出发full gc,cms默认提供参数默认开启full gc。

JVM 垃圾回收机制和常见算法的更多相关文章

  1. jvm垃圾回收机制和常见算法

    这是朋友给的面试题里边的,具体地址已经找不到,只能对原作者说声抱歉了: 理论上来讲sun公司只定义了垃圾回收机制规则,而步局限于其实现算法,因此不同厂商生产的虚拟机采用的算法也不尽相同. GC(Gar ...

  2. JVM 垃圾回收机制和常见算法和 JVM 的内存结构和内存分配(面试题)

    一.JVM 垃圾回收机制和常见算法 Sun 公司只定义了垃圾回收机制规则而不局限于其实现算法,因此不同厂商生产的虚拟机采用的算法也不尽相同.GC(Garbage Collector)在回收对象前首先必 ...

  3. JVM垃圾回收机制和常用算法

    由于疫情的原因,所以目前一直在家远程办公,所以很多时间在刷面试题,发现2019大厂的面试虽然种类很多,但是总结了一下发现主要是这几点:算法和数据结构. JVM.集合.多线程.数据库这几点在面试的时候比 ...

  4. JVM虚拟机(四):JVM 垃圾回收机制概念及其算法

    垃圾回收概念和其算法 谈到垃圾回收(Garbage Collection)GC,需要先澄清什么是垃圾,类比日常生活中的垃圾,我们会把他们丢入垃圾箱,然后倒掉.GC中的垃圾,特指存于内存中.不会再被使用 ...

  5. JVM内存管理和JVM垃圾回收机制

    JVM内存管理和JVM垃圾回收机制(1) 这里向大家描述一下JVM学习笔记之JVM内存管理和JVM垃圾回收的概念,JVM内存结构由堆.栈.本地方法栈.方法区等部分组成,另外JVM分别对新生代和旧生代采 ...

  6. JVM垃圾回收机制概述

    JVM垃圾回收机制概述 1.定义 是指JVM用于释放那些不再使用的对象所占用的内存. 2.方式 2.1引用计数(早期) 当引用程序创建引用以及引用超出范围时,JVM必须适当增减引用数.当某个对象的引用 ...

  7. JVM基础系列第8讲:JVM 垃圾回收机制

    在第 6 讲中我们说到 Java 虚拟机的内存结构,提到了这部分的规范其实是由<Java 虚拟机规范>指定的,每个 Java 虚拟机可能都有不同的实现.其实涉及到 Java 虚拟机的内存, ...

  8. JVM内存管理、JVM垃圾回收机制、新生代、老年代以及永久代

    内存模型 JVM运行时数据区由程序计数器.堆.虚拟机栈.本地方法栈.方法区部分组成,结构图如下所示. JVM内存结构由程序计数器.堆.栈.本地方法栈.方法区等部分组成,结构图如下所示: 1)程序计数器 ...

  9. 真的可惜,四面阿里,结果我被JVM垃圾回收机制与 OOM异常卡住了

    前言 为什么需要垃圾回收 首先我们来聊聊为什么会需要垃圾回收,假设我们不进行垃圾回收会造成什么后果,我们举一个简单的例子 我们住在一个房子里面,我们每天都在里面生活,然后垃圾都丢在房子里面,又不打扫, ...

随机推荐

  1. Mysql读写分离——主从数据库+Atlas

    mysql集群 最近在参加项目开发微信小程序后台,由于用户数量巨大,且后台程序并不是很完美,所以对用户的体验很是不友好(简单说就是很卡).赶巧最近正在翻阅<大型网站系统与Java中间件实践> ...

  2. 【Docker】第三篇 Docker容器管理

    一.Docker容器概述: 简单理解容器是镜像的一个实例. 镜像是静态的只读文件,而容器的运行需要可写文件层. 二.创建容器 [root@web130 ~]# docker create -it ub ...

  3. Codeforces70 | Codeforces Beta Round #64 | 瞎讲报告

    目录 前言 正文 A B C D E 前言 这个毒瘤的517 放了Div1 然后D题是昨天讲的动态凸包(啊喂!我还没来的及去写 结果自己想的是二分凸包 (当然没有写出来 写完前两题之后就愉快地弃疗 C ...

  4. Django之自带认证

    自带登录实例 {% extends "layout/base.html" %} // 所有link {% block body %} <div id="contai ...

  5. 如何将office卸载干净

    我试了控制面板卸载office软件等方法,发现一直卸载不干净. 后发现这个office的官方链接,根据这个链接的步骤就很轻松的卸载好了. https://support.office.com/zh-c ...

  6. 为什么要读这本书《java编程思想》

    在学校学习编程语言只是浅显的了解,不理解的的东西有很多 ,想通过这本书对java语言有更深的理解,对于以后的学习和工作会有很大的好处.与其了了草草的看你一些书,知其然而不知其所以然,这不是我想要的学习 ...

  7. <!CDATA[]]用法详解

    所有 XML 文档中的文本均会被解析器解析. 只有 CDATA 区段(CDATA section)中的文本会被解析器忽略. PCDATA PCDATA 指的是被解析的字符数据(Parsed Chara ...

  8. Spring笔记②--各种属性注入

    Ioc 反转控制 反转资源获取的方向 分离接口与实现 采用工厂模式 采用反转控制   Di 依赖注入 依赖容器把资源注入   配置bean 通过全类名(反射) 配置形式:基于xml方式 Ioc容器的b ...

  9. HDU 1565 方格取数(1) 轮廓线dp

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1565 方格取数(1) Time Limit: 10000/5000 MS (Java/Others) ...

  10. Git初用心得

    第一次使用git,因为之前操作系统的实验需要,在虚拟机中使用过lniux系统,所以对这种用指令输入而不是图形化的程序感觉不是很陌生.感觉git还是很人性化的,git gui就是图形界面,操作起来也不复 ...