对象的回收

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

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. C++之运算符重载(前置++和后置++)

    今天在阅读<google c++ 编程风格>的文档的时候,5.10. 前置自增和自减:有一句话引起了我的注意: 对于迭代器和其他模板对象使用前缀形式 (++i) 的自增, 自减运算符.,理 ...

  2. VirtualBox下安装ubuntu图文教程以及软件安装

    一. 下载安装VirtualBox 官网下载VirtualBox,目前版本:VirtualBox 5.1.8 for Windows hosts x86/amd64 下载好了安装VirtualBox, ...

  3. HDU1171(01背包均分问题)

    Big Event in HDU Time Limit:5000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u De ...

  4. Python interview_python

    https://github.com/taizilongxu/interview_python 1 Python的函数参数传递 strings, tuples, 和numbers是不可更改的对象,而l ...

  5. ERROR (UnicodeEncodeError): 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128

    ERROR (UnicodeEncodeError): 'ascii' codec can't encode characters in position 0-1: ordinal not in ra ...

  6. Foreign Postcards

    题意: 给定 n 张排成一堆的的卡片,每一次从堆顶上等概率随机取出 [1~当前卡片数] 个卡片,如果堆顶的卡片是反面朝上, 则将所有取出的卡片翻转,求问期望取出多少个反面朝上的卡片. 解法: 考虑dp ...

  7. 【eclipse插件开发实战】Eclipse插件开发7——插件发布jar包

    Eclipse插件开发7--插件发布jar包 最省事的方式就是直接导出jar包,然后放到eclipse的plugins目录下,重启eclipse即可. step1: 对需要打包的插件工程右击→导出(E ...

  8. 共相式GIS

    今天看到SuperMap中一直提到共相式GIS,于是乎搜索一下……SuperMap的共相式怎么理解呢?iServer Java有咋理解呢??? 再谈共相式GIS和ArcObjects:ttp://ww ...

  9. 区间sum 和为k的连续区间-前缀和

    区间sum 描述 有一个长度为n的正整数序列a1--an,candy想知道任意区间[L,R]的和,你能告诉他吗? 输入 第一行一个正整数n(0<n<=1e6),第二行为长度为n的正整数序列 ...

  10. E20180513-hm

    letter n. 信; 证书,许可证; 字母,文字; 字面意义; bracket n. 支架,悬臂; 括弧; 类别,等级; [数] 同类项; coefficient  n. 系数; (测定某种质量或 ...