对象的回收

垃圾的回收涉及的几个问题:何时回收,由谁回收,怎样回收。这几个问题我们一一来解决。

1、何时回收----对象的生死判定

对象达到什么条件才能判断这个对象已经无用了。常见的判断对象生死的方法有两种:
(1)引用计数法
给每个对象添加一个引用计数器,只要有地方引用到这个对象,这个对象的计数器就会加1,当引用失效时,计数器就相应的减1。
引用计数法的问题:当两个对象互相引用,并且其他任何地方都没有引用这两个对象,那么根据引用计数法判定就永远无法回收这两个对象。
(2)可达性分析
通过一系列的成为GC Roots的对象作为起点,然后向下搜索,搜索的路径成为引用链,当一个对象到GC Roots没有任何引用链时,那么就说明次对象不可达。
GCRoots对象包括:
方法区:类静态属性引用的对象
方法区:常量引用的对象
虚拟机栈:局部变量表中存储的对象引用引用的对象
本地方法栈:JNI方法引用的对象
关于可达性分析和GC Roots有很多可说的,详细请点-------------------------------

2、怎样回收----垃圾回收算法

通过对象的生死判定算法我们已经知道那些对象已经死了,那我们怎样才能将这些对象回收呢?垃圾回收算法告诉我们这些无用的对象应该怎样回收。垃圾回收算法大体分为三种:复制算法,标记-清除算法,标记整理算法。其中复制算法常用于对新生代的收集,标记清除和标记整理用于对老年代的收集,具体的原因下文会介绍。
(1)复制算法
将可用的内存划分成大小相等的两块,每次只是用其中的一块,当这一块内存使用完了之后,就将还存活的对象复制到另一块内存上,然后把已经使用过的内存空间统一清理掉。

该回收算法的效率虽高,但内存空间的使用效率并不高,因为总是有一般的内存时间使用不上。所以现在商用的JVM虚拟机一般不会将内存空间划分为两个相等的两块,而是划分成一个较大的Eden区和两块较小的Survivor区,Eden和Survivor的比例大小为8:1:1。具体的分代请看https://www.cnblogs.com/ozho/p/10589077.html
(2)标记清除算法
标记清除算法分为标记阶段和清除阶段。
标记阶段:通过可达性分析将需要清除的对象标记
清除阶段:将标记的对象清除。
标记清除算法的问题:效率不高并且会产生大量不连续的内存碎片

(3)标记整理算法
是对标记清除优化的一种算法。在清除阶段之后,会将所有存活的对象移动到内存的一端,然后清理掉剩余可用的内存空间

再谈分代收集
上文已经提到新生代收集由复制算法实现,老年代由标记清除或者标记整理算法实现。新生代收集只能由复制算法实现,老年代只能由标记清除或者标记整理算法实现的原因:
新生代中大多数对象都是“朝生夕死”的,每经过一次Minor GC都会有一大批对象死去,只有少量的对象存活。所以这些少量存活对象复制成本很低,但是在老年代中对象的存活率很高,如果采用Eden区:Suvivor=8:1的比例分配,没有足够的分配空间分配。
永久代的垃圾回收;
永久代的垃圾回收主要为两部分:无用的类和废弃的常量。
关于“由谁回收”的问题下篇继续分析:垃圾回收器
参考:《深入理解JVM虚拟机》

JVM垃圾回收机制二的更多相关文章

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

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

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

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

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

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

  4. JVM垃圾回收机制总结:调优方法

    转载: JVM垃圾回收机制总结:调优方法 JVM 优化经验总结 JVM 垃圾回收器工作原理及使用实例介绍

  5. JVM垃圾回收机制概述

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

  6. Java虚拟机学习笔记——JVM垃圾回收机制

    Java虚拟机学习笔记——JVM垃圾回收机制 Java垃圾回收基于虚拟机的自动内存管理机制,我们不需要为每一个对象进行释放内存,不容易发生内存泄漏和内存溢出问题. 但是自动内存管理机制不是万能药,我们 ...

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

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

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

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

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

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

随机推荐

  1. POJ2184(01背包变形)

    Cow Exhibition Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11092   Accepted: 4404 D ...

  2. oracle 10g 静默安装(无图形化)

    Oracle 10g无图形界面安装 此文档是在oracle环境变量已经配置完成,不缺少依赖包的情况下进行安装: 解压oracle的安装包, 首先vi database/response/enterpr ...

  3. 19.break和continue

    break;语句: 1.可以在switch语句中,结束分支语句: 2.break:语句可以出现在单循环当中,默认情况下结束距离他最近的一个循环. 3.break 后面跟一个循环的名字可以结束你指定的这 ...

  4. 蓝桥杯 2014本科C++ B组 李白打酒 三种实现方法 枚举/递归

    标题:李白打酒 话说大诗人李白,一生好饮.幸好他从不开车. 一天,他提着酒壶,从家里出来,酒壶中有酒2斗.他边走边唱: 无事街上走,提壶去打酒. 逢店加一倍,遇花喝一斗. 这一路上,他一共遇到店5次, ...

  5. Win7点击文件夹右键可打开cmd控制台,并获取当前目录

    当我们用cmd时,有时要切换到某个文件夹的目录,可以在当前目录下,按住shift单击右键打开控制台,也可以在鼠标右键中添加cmd启动命令: 1.在开始搜索框输入regedit,打开注册表: 2.打开 ...

  6. 2.11-2.12 HBase的数据迁移常见方式

    一.importtsv 把hdfs中数据抽取到HBase表中: 1.准备数据 ##student.tsv [root@hadoop-senior datas]# cat student.tsv 100 ...

  7. java集合框架之聚合操作stream

    参考http://how2j.cn/k/collection/collection-aggregate/702.html#nowhere 聚合操作 JDK8之后,引入了对集合的聚合操作,可以非常容易的 ...

  8. hdu2147(yy)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2147 题意:给出一个n*m的矩阵,一开始有个点在最右上方, 两个人轮流移动点,可以向左移一格,或者向下 ...

  9. 初次接触Service笔记

    Service是后台的运行的小程序,分两种一种是StarService()另外一种是bindService(),这种可调用Service中的方法和返回结果等操作而StarService不能 他的生命周 ...

  10. LeetCode.897-递增搜索树(Increasing Order Search Tree)

    这是悦乐书的第346次更新,第370篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第211题(顺位题号是897).给定一棵树,按中序遍历顺序重新排列树,以便树中最左边的节 ...