Java GC机制简要总结(Java垃圾回收的基本工作原理)
第一次编辑 2019-05-07 01:09:39
垃圾回收的对象
程序中的不可用对象(不存活的对象,没有任何引用),或者无用的变量信息等,在程序中长期存在会逐渐占用较多的内存空间,导致没有足够的空间分配给新生成的对象等.
判断哪些是需要回收的对象
早期jdk使用引用计数法,计数每个对象的引用次数,对于没有引用的对象进行删除,但是该方法无法处理循环引用情况.
之后引入了可达性分析算法,将所有的引用关系看作一张图,从一个结点(GC ROOT)开始,寻找向下的引用结点,之后重复这一过程,其中的路径被称为引用链,当一个对象没有与GC ROOT相连的引用链时,该对象是不可用的
执行回收的时间
在CPU空闲时自动回收,或在堆内存满后进行回收,或者程序中调用System.gc()后进行回收
执行回收的算法
共有四种
- 1. 标记-清除算法
分两步执行,首先标记,根据可达性分析标记出所有需要回收的对象,之后对被标记的对象进行回收.
该方法不需要移动对象,只对不可用对象操作,较为简单.但是一般情况下,效率较低,同时由于直接回收垃圾,会产生内存碎片,后续为较大对象分配空间时,可能因为无法找到较大的连续内存空间而必须再次进行垃圾回收过程
- 2. 复制算法
将可用的内存按照容量大小等分,每次只使用一块空间进行分配,当这一块用完时,将可用对象移动到另一块空间上,然后清理已经用过的空间.
该方法每次只需要对一半的空间进行回收,同时解决了内存碎片的问题.但是使用中浪费了一半的内存空间,在可用对象较多的情况下需要进行较多的复制,效率降低.
- 3. 标记-整理算法
标记-清除法的改进.在使用标记-清除算法回收不可用对象后,将所有可用的对象压缩到内存的一端,之后清理端边界之外的所有内存.
该方法解决了内存碎片的问题,但是增加了对象移动的过程,执行的成本较高
- 4. 分代收集算法
目前主要使用的方法
根据对象存活的周期将内存(堆)分为多块,一般是新生代,老年代和永生代(永久代).在不同的代使用不同的收集器(收集器使用不同的算法)进行回收,提高效率.
新生代
尽快的收集生命周期短的对象.新生代内部一般被分为三个部分,分别是Eden区,survivor0区和survivor1区,分配的比例为8:1:1.新产生的对象首先被放置到Eden区,当该区被放置满之后,将该区的存活对象移动到survivor0区,之后清空Eden区,当survivor0区也被放置满时,将Eden区和survivor0区存活对象复制到survivor1区,之后清空Eden区和survivor0区.,交换survivro0区和survivor1区,即保持survivor1区为空,之后重复该过程.
当survivor1区不够存放eden区和survivor0区的存活对象时,将这些对象放入老年代.
在这个过程中的垃圾回收过程被称为Minor GC(小型垃圾回收),该过程发生比较频繁,不一定严格等待eden区满才执行.该回收过程发生时,所有程序线程暂停,直到完成回收工作,是Stop the world(STW)事件的一种.
老年代
存放生命周期较长的对象.老年代的空间较新生代大,当老年代满时触发Major GC,该过程同样导致STW,并且时间比Minor GC更长.
永久代
存放静态文件,如类或方法等.一些运行过程中动态生成的类会被放置到这里.
各代使用不同的回收器,新生代使用应用复制算法的收集器,老年代使用应用标记-清除或标记-整理算法的收集器
Java8废弃了永久代,用元空间进行代替;在JDK1.7中推出了新的G1收集器.
参考如下
https://baijiahao.baidu.com/s?id=1610753983428990724&wfr=spider&for=pc
https://blog.csdn.net/weixin_39067991/article/details/81045201
https://blog.csdn.net/w372426096/article/details/81360083
Java GC机制简要总结(Java垃圾回收的基本工作原理)的更多相关文章
- Java GC系列(2):Java垃圾回收是如何工作的?
本文由 ImportNew - 伍翀 翻译自 javapapers. 目录 垃圾回收介绍 垃圾回收是如何工作的? 垃圾回收的类别 垃圾回收监视和分析 本教程是为了理解基本的Java垃圾回收以及它是如何 ...
- (转)《深入理解java虚拟机》学习笔记3——垃圾回收算法
Java虚拟机的内存区域中,程序计数器.虚拟机栈和本地方法栈三个区域是线程私有的,随线程生而生,随线程灭而灭:栈中的栈帧随着方法的进入和退出而进行入栈和出栈操作,每个栈帧中分配多少内存基本上是在类结构 ...
- 在Java中谈尾递归--尾递归和垃圾回收的比较(转载)
我不是故意在JAVA中谈尾递归的,因为在JAVA中谈尾递归真的是要绕好几个弯,只是我确实只有JAVA学得比较好,虽然确实C是在学校学过还考了90+,真学得没自学的JAVA好 不过也是因为要绕几个弯,所 ...
- Java中谈尾递归--尾递归和垃圾回收的比较
一.首先我们讲讲递归 1.递归的本质是,某个方法中调用了自身,本质还是调用了一个方法,只是这个方法正好是自身而已 2.递归因为是在自身中调用自身,所以会带来以下三个显著特点: 1.调用的是同一个 ...
- 在Java中谈尾递归--尾递归和垃圾回收的比较
我不是故意在JAVA中谈尾递归的,因为在JAVA中谈尾递归真的是要绕好几个弯,只是我确实只有JAVA学得比较好,虽然确实C是在学校学过还考了90+,真学得没自学的JAVA好 不过也是因为要绕几个弯,所 ...
- Java垃圾回收是如何工作的?
本教程是为了理解基本的Java垃圾回收以及它是如何工作的.这是垃圾回收教程系列的第二部分.希望你已经读过了第一部分:<Java 垃圾回收介绍>. Java 垃圾回收是一项自动化的过程,用来 ...
- 《Beginning Java 7》 - 8 - Collecting Garbage 垃圾回收
Java 垃圾回收机制原理: Java 语言使用 garbage collector 来进行垃圾回收.它是允许在后台的代码,间或地检查没有引用的对象(unreferenced object).发现后, ...
- Java运行时内存划分与垃圾回收--以及类加载机制基础
----JVM运行时内存划分----不同的区域存储的内容不同,职责因为不同1.方法区:被线程共享,存储被JVM加载的类的信息,常量,静态变量等2.运行时常量池:属于方法区的一部分,存放编译时期产生的字 ...
- 【Java面试题】49 垃圾回收的优点和原理。并考虑2种回收机制。
1.Java语言最显著的特点就是引入了垃圾回收机制,它使java程序员在编写程序时不再考虑内存管理的问题. 2.由于有这个垃圾回收机制,java中的对象不再有“作用域”的概念,只有引用的对象才有“作用 ...
随机推荐
- js 时间戳精确值的问题
最近做一个多图上传的功能,通过name + 时间戳命名,结果发现时间戳竟然一样,一直以为是代码逻辑的问题,结果出错在时间戳的获取上了. 关于时间戳的获取方式: 1.Date.parse() var d ...
- nginx配置实战以及查看并发数
http://www.cnblogs.com/kevingrace/p/6095027.html http://www.cnblogs.com/lianzhilei/p/6025267.html
- 51Nod 1282 时钟 —— 最小表示法 + 字符串哈希
题目链接:https://vjudge.net/problem/51Nod-1282 1282 时钟 题目来源: Codility 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难 ...
- HDU 2036:改革春风吹满地
改革春风吹满地 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Su ...
- 集合框架、泛型、迭代(java基础知识十六)
1.ArrayList存储自定义对象并遍历 此类的 iterator 和 listIterator 方法返回的迭代器是快速失败的:在创建迭代器之后,除非通过迭代器自身的 remove 或 add 方法 ...
- poj 2531 Network Saboteur 解题报告
题目链接:http://poj.org/problem?id=2531 题目意思:将 n 个点分成两个部分A和B(也就是两个子集啦), 使得子集和最大(一定很难理解吧,呵呵).举个例子吧,对于样例,最 ...
- Pycharm中如何安装python库
1首先打开pycharm工具,选择File中的Setting选项,如下图所示 2在打开的setting界面中我们点击python的解释器,你会看到很多导入的第三方库,如下图所示,点击最右边的加号 3在 ...
- Android Platform Version与API Level的对应表
Platform Version API Level VERSION_CODE Notes Android 6.0 23 M Platform Highlights Android 5.1 22 LO ...
- UVA-10827(前缀和降维)
题意: 给一个n*n的正方形,第一行和最后一行粘在一块,第一列和最后一列粘在一块,求这个环面上的最大的子矩形; 思路: 直接暴力是O(n^6)的复杂度,可以把前缀和求出来,这样就可以只用枚举四条边界就 ...
- (水题)洛谷 - P1478 - 陶陶摘苹果(升级版)
https://www.luogu.org/problemnew/show/P1478 没啥好说的…… 居然还漏写一个等于号WA了一发. #include<bits/stdc++.h> u ...