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中的对象不再有“作用域”的概念,只有引用的对象才有“作用 ...
随机推荐
- POJ2955 Brackets —— 区间DP
题目链接:https://vjudge.net/problem/POJ-2955 Brackets Time Limit: 1000MS Memory Limit: 65536K Total Su ...
- 序列流、对象操作流、打印流、标准输入输出流、随机访问流、数据输入输出流、Properties(二十二)
1.序列流 * 1.什么是序列流 * 序列流可以把多个字节输入流整合成一个, 从序列流中读取数据时, 将从被整合的第一个流开始读, 读完一个之后继续读第二个, 以此类推.* 2.使用方式 * 整合两个 ...
- jQuery制作信息提示弹出层插件【推荐】
给大家分享一款非常实用的弹窗提示窗口插件,包含多种模式.带有回执函数值的功能.1. [代码][JavaScript]代码 <script type="text/javascript& ...
- 关闭ext4文件系统的日志功能
最近在帮一个研究生弄一个虚拟化环境下的基于Innodb的日志文件的读写优化的实验,实验的具体详细内容就不说了,其中有一个步骤需要将MySQL的日志文件放置在一块单独的硬盘里面,这块硬盘要么是ext2, ...
- 「LuoguT36048」 Storm in Lover
Description 平成二十四年(2012年),5月11日,东京,某弓道场. "呐,呐,海未酱,你听说了吗?几天后的那场弓道大会?啊-!"橙发少女兴奋地拿着一张传单一样的纸跑向 ...
- python-----windows下安装face_recognition库
如果直接在cmd命令界面 输入:pip install face_recognition 如下图所示: 如果第一次就会出现一系列的问题,解决此问题就安装如下步骤: 一.如果你本机没有安装vistual ...
- [laravel]phpunit
step1.install phpunit composer.json require中增加 "phpunit/phpunit":"4.0.*" 执行 comp ...
- 【推荐】 体验SubSonic
SubSonic简介 SubSonic配置 利用sonic.exe来生成代码 通过Substage来生成代码 简单操作示例 1.SubSonic简介 一句讲完就是:SubSonic就是一个ORM开源框 ...
- The IBM Blockchain Platform:Installing the development environment
Follow these instructions to obtain the IBM Blockchain Platform: Develop development tools (primaril ...
- JavaScript面向对象轻松入门之综合
javascrpit面向对象之综合 这一章是对前几章的一个总结,通过一个案例来综合认识javascript面向对象的基本用法 需求: 几乎所有的web应用都需要保存数据一些到本地,那么我们就来 ...