这是朋友给的面试题里边的,具体地址已经找不到,只能对原作者说声抱歉了;

  

  理论上来讲sun公司只定义了垃圾回收机制规则,而步局限于其实现算法,因此不同厂商生产的虚拟机采用的算法也不尽相同。

  GC(Garbage  Collector)在回收对象前首先必须发现那些无用的对象,如何发现这些对象,常用的搜索算法如下:

  1) 引用计数器算法(废弃)

  引用计数器算法是个每个对象设置一个计数器,当有地方引用这个对象的时候,计数器➕1,当引用失效的时候计数器-1,当计数器为0的时候,JVM就认为对象不再被使用,是“垃圾”了。

  引用计数器实现简单,效率高;但是不能解决循环引用问题(A对象引用B对象,B对象又引用A对象,但是A,B对象已不被任何其他对象引用)同时每次计数器的增加和减少都带来很多额外开销,所以在JDB1.1之后,这个算法已经不再被使用。

  2)跟搜索算法(使用)

  跟搜索算法是通过一些“GC  Roots”对象作为起点,从这些节点开始往下搜索,搜索通过的路径成为引用链,当一个对象没有被GC  Roots的引用链接的时候,说明这个对象是不可用的。

  GC  Roots对象包括:

  a)虚拟机栈(栈帧中的本地变量表)中引用的对象。

  b)方法区域中的类静态属性引用的对象。

  c)方法区域中常量引用的对象。

  d)本地方法栈中JNI(Native方法)的引用对象。

    通过上面的算法搜索到无用对象之后,就是回收过程,回收算法如下:

    1)标记——清除算法(Mark-Sweep)(DVM使用的算法)

    标记——清除算法包括两个阶段:“标记”和“清除”。在标记阶段,确定所有要回收的对象,并做标记。清除阶段紧随标记阶段,将标记阶段不可用的对象清除。标记——清除算法是基础的收集算法,标记和清除阶段的效率不高,而且清除后会产生大量的不连续空间,这样但程序需要分配大内存对象时,可能无法找到足够的连续空间。

    2)复制算法

    复制算法是把内存分成大小相等的两块,每次使用其中的一块,当垃圾回收的时候,把存活的对象复制到另一块上,然后把这块内存整个清理掉。复制算法实现简单,运行效率高,但是由于每次只能使用其中的一半,造成内存的利用率不高。现在的JVM用复制的方法收集新生代,由于新生代中大部分对象(98%)都是朝生夕死的,所以两块内存的比例不是1:1(大概是8:1)。

    3)标记——整理算法(Mark-Conpact)

     标记——整理算法和标记——清除算法一样,但是标记——整理算法不是把存活对象复制到另一块内存,而是把内存活的对象往内存的一端移动,然后直接回收辩解以外的内存。标记——整理算法提高了内存的利用率,并且它适合在收集对象存活时间较长的老年代。

    4)分代收集(Generational  Collection)

    分代收集是根据对象的存活时间把内存分为新生代和老生代,根据各个代对象的存活特点,每个代采用不同的垃圾回收算法。新生代采用复制算法,老年代采用标记——整理算法。垃圾算法的实现涉及大量的程序细节,而且是不同的虚拟机平台实现的方法也各不相同。

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

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

    垃圾回收机制:释放那些不再持有引用的对象的内存. 如何判断对象是否需要回收? 引用计数:对象,内存,磁盘空间等被引用次数保存起来,次数为0时将其进行释放. 对象引用遍历:对象应用遍历从一组对象开始,沿 ...

  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. BZOJ4236:JOIOJI(乱搞)

    Description JOIOJI桑是JOI君的叔叔.“JOIOJI”这个名字是由“J.O.I”三个字母各两个构成的. 最近,JOIOJI桑有了一个孩子.JOIOJI桑想让自己孩子的名字和自己一样由 ...

  2. tarjan【模板】缩点

    传送门:https://www.luogu.org/problemnew/show/P3387 首先呢,tarjan找一个图的强连通分量是基于对图的dfs的.这中间开了一个dfn[]代表dfs序,还有 ...

  3. 1、pyspider安装

    系统环境: centos6.6.python2.7 经测试,python2.6安装的pyspider会导致webui无法正常访问 参考博文: http://cuiqingcai.com/2443.ht ...

  4. Android-ProgressDialog点击对话框外部是不让其消失

    1)ProgressDialog.setCanceledOnTouchOutside(false); 调用这个方法时,按对话框以外的地方不起作用.按返回键还起作用 2)ProgressDialog.s ...

  5. Android关于LinearLayout和RelativeLayout背景设置的区别

    1.LinearLayout:设置背景时即设置android:background时,假如LayoutLayout设置了android:layout_width="wrap_content& ...

  6. P1272 重建道路

    题目描述 一场可怕的地震后,人们用N个牲口棚(1≤N≤150,编号1..N)重建了农夫John的牧场.由于人们没有时间建设多余的道路,所以现在从一个牲口棚到另一个牲口棚的道路是惟一的.因此,牧场运输系 ...

  7. (二)基于阿里云的MQTT远程控制(购买阿里云,在云端安装MQTT,测试MQTT远程通信)

    QQ名称为Friday~的网友把他自己买MQTT的过程截图发给了我,今天就说一下如何购买阿里云,安装MQTT可以参考 http://www.cnblogs.com/yangfengwu/p/77646 ...

  8. shell杂记

    (本文将持续更新)从2015年9月25日开始正式学习linux类的东西. 书籍入门:UNIX.Shell编程24学时教程(中文版).Linux与UNIX Shell编程指南.shell十三问.LINU ...

  9. 将公钥部署到远程Git仓库(coding.net)

    步骤: 1.下载git通用客户端并且安装. 2.右键,在弹出的对话框中选择Git Bash 3.创建本地ssha)在弹出的终端输入ssh-keygen -t rsa -C "username ...

  10. 20155302《网络对抗》Exp3 免杀原理与实践

    20155302<网络对抗>Exp3 免杀原理与实践 实验要求 1.正确使用msf编码器,msfvenom生成如jar之类的其他文件,veil-evasion,自己利用shellcode编 ...