参考链接:https://www.cnblogs.com/aspirant/p/8662690.html

一,垃圾回收算法

JVM内存结构:程序计数器、虚拟机栈、本地方法栈、堆区、方法区

1,引用计数法:

早期JAVA使用的算法

原理:当对象被创建时,这个对象的实例会关联到一个变量进行计数,每当该实例被引用1次计数器+1,失去1个引用时,计数器减1。计数为0时,该对象处于可以被回收的状态。

优点:实时执行,应用不会挂起,只影响部分区域,不影响全部区域,速度快。

缺点:每次对象被引用,都会计数,增加了开销;并且无法解决循环引用问题。

引用计数法对象互相引用导致无法回收问题解决方案:https://www.zhihu.com/question/44079404

我能理解的有两个:

1,将循环引用的代码改成弱引用。

2,重构代码,让循环引用的场景不再出现。

其他后续的后续研究吧。

2,可达性分析算法(GCRoots):https://blog.csdn.net/qq_38844645/article/details/80494742

原理:简单地说,从根节点遍历,找到所有有关系的节点。没有引用的节点就是可以回收的对象。当没有引用的节点被扫描到后,会进行标记。下一次扫描时,才会清除这个节点。如果这个节点在下一次GC时重新建立了引用关系,则不会被回收。

优点:回收更彻底

缺点:消耗大,会造成应用停顿

3,标记-清除法:https://www.cnblogs.com/Leo_wl/p/3269590.html

原理:在JVM的堆中,从根节点遍历,找到所有存活的对象并进行标记。然后再遍历一次,找到没有被标记的进行回收

优点:不影响线程

缺点:会停止整个停止进行标记清除,所以会造成应用卡顿;因为直接回收了不存活的对象,所以会产生内存碎片。

4,复制算法

原理:复制存活的对象到另外一个空间,使存活的对象之间没有空白的内存地址?

优点:解决标记-清除法产生碎片的问题

缺点:占用双倍内存

5,标记整理算法

原理:和标记清除算法差不多,但是并不是直接回收,而是移动存活对象的内存地址,使存活对象都连在一起。

优点:

缺点:这就是FULL GC 会造成应用卡顿。

6,分代收集算法

原理:根据对象的生命周期将内存划分为不同的区域:新生代,老年代,永久代,内存分配比例为新生代:老年代=1:2,永久代呢?有一套特定的计算方法。。其中新生代分为eden区,survivor1,survivor2。按照8:1:1的比例划分内存。

新的对象先进入eden区,eden区垃圾回收得很活跃,当经历几次回收后,如果对象依然存活,则复制到survivor1区,servivor1区也会有垃圾回收,但是频率没有eden区高,当survivor1区容量满了之后,survivor1中存活得对象复制到survivor2中。如此往复,直到survivor1区放不下对象,则将servivor存活的对象放到老年代。老年代中空间满之后,则进行FULL GC。新生代和老年代都装不下的大对象,则直接进入永久代。永久代都装不下的大对象,就会抛出永久代内存溢出的错误。所以一个大的查询语句就可以把内存玩崩。

新生代算法:minor GC (镜像GC?复制?)

老年代算法:标记-整理算法

永久代:永久代主要用于存放静态文件,如JAVA的类和方法。

回收方法:可达性分析算法(GCRoots)回收废弃的变量。

无用的类回收:该类所有实例已经被回收,加载该类的classloader被回收,该类的class对象没有被任何地方引用和反射。

附上:元空间和持久代(永久代)的区别: https://blog.csdn.net/u011531613/article/details/62971713

元空间:最小的数据单元,放在内存中

持久代:放在JVM中。

7,GC 的两种类型:Scavenge GC 和FULL GC

当新对象在eden区申请内存空间失败时,触发Scavenge GC。清除eden区存活对象并转移到Survivor区中,然后整理Survivor的两个区。

FULL GC:

1,老年代空间满了触发

2,持久代被写满

3,持久代内存动态调整:比如,设置的持久代空间为1024M-2048M。那么当持久代达到1024时,触发扩容策略,进行FULL GC

4,主动调用GC。

8,强引用,软引用,弱引用,虚幻引用:https://www.cnblogs.com/fengbs/p/7019687.html

强引用:大致是只要还有引用关系,就不会被回收。Object obj = new Object()

软引用:内存溢出前,回收软引用

SoftReference<String> softRef=new SoftReference<String>(str);

弱引用:生命周期是下一次垃圾回收之前  WeakReference<String> weakRef = new WeakReference<String>(str);

虚幻引用:作用就是能在这个对象被收集器回收时收到一个系统通知

9,按线程划分算法

串行:

使用单线程执行回收算法,但是无法使用多线程的核心,会stop the world

并行

使用多个cpu线程并行执行垃圾回收,效率更高,但是还是会stop the world

并发

实时并发地回收,不影响用户。

新生代:串行垃圾回收器,ParNew收集器(复制),Parellel收集器(复制)

老年代:ParNew收集器(标记-压缩),Parellel 收集器(标记-压缩),Parallel Old 收集器,CMS,G1收集器

【JVM】学习JVM垃圾回收理论的更多相关文章

  1. JVM学习笔记——垃圾回收篇

    JVM学习笔记--垃圾回收篇 在本系列内容中我们会对JVM做一个系统的学习,本片将会介绍JVM的垃圾回收部分 我们会分为以下几部分进行介绍: 判断垃圾回收对象 垃圾回收算法 分代垃圾回收 垃圾回收器 ...

  2. JVM学习--(四)垃圾回收算法

    我们都知道java语言与C语言最大的区别就是内存自动回收,那么JVM是怎么控制内存回收的,这篇文章将介绍JVM垃圾回收的几种算法,从而了解内存回收的基本原理. stop the world 在介绍垃圾 ...

  3. JVM学习记录-垃圾回收算法

    简述 因为各个平台的虚拟机的垃圾收集器的实现各有不同,所以只介绍几个常见的垃圾收集算法. JVM中常见的垃圾收集算法有以下四种: 标记-清除算法(Mark-Sweep). 复制算法(Copying). ...

  4. JVM学习——G1垃圾回收器(学习过程)

    JVM学习--G1垃圾回收器 把这个跨时代的垃圾回收器的笔记独立出来. 新生代:适用复制算法 老年代:适用标记清除.标记整理算法 二娃本来看G1的时候觉得比较枯燥,但是后来总结完之后告诉我说,一定要慢 ...

  5. 【转载】Java性能优化之JVM GC(垃圾回收机制)

    文章来源:https://zhuanlan.zhihu.com/p/25539690 Java的性能优化,整理出一篇文章,供以后温故知新. JVM GC(垃圾回收机制) 在学习Java GC 之前,我 ...

  6. Java性能优化之JVM GC(垃圾回收机制)

    Java的性能优化,整理出一篇文章,供以后温故知新. JVM GC(垃圾回收机制) 在学习Java GC 之前,我们需要记住一个单词:stop-the-world .它会在任何一种GC算法中发生.st ...

  7. JVM总括二-垃圾回收:GC Roots、回收算法、回收器

    JVM总括二-垃圾回收:GC Roots.回收算法.回收器 目录:JVM总括:目录 一.判断对象是否存活 为了判断对象是否存活引入GC Roots,如果一个对象与GC Roots没有直接或间接的引用关 ...

  8. 浅谈jvm中的垃圾回收策略

    下面小编就为大家带来一篇浅谈jvm中的垃圾回收策略.小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧   java和C#中的内存的分配和释放都是由虚拟机自动管理的,此前我已 ...

  9. Java进阶 JVM 内存与垃圾回收篇(一)

    JVM 1. 引言 1.1 什么是JVM? 定义 Java Vritual Machine - java 程序的运行环境(Java二进制字节码的运行环境) 好处 一次编译 ,到处运行 自动内存管理,垃 ...

  10. 【JVM】JVM系列之垃圾回收(二)

    一.为什么需要垃圾回收 如果不进行垃圾回收,内存迟早都会被消耗空,因为我们在不断的分配内存空间而不进行回收.除非内存无限大,我们可以任性的分配而不回收,但是事实并非如此.所以,垃圾回收是必须的. 二. ...

随机推荐

  1. USB设备判断接入和移除

    目录 以沁恒的CH582芯片为例,主机模式下,在R8_USB_INT_EN中可以使能RB_UIE_DETECT位,由中断来提醒检测USB设备的接入和移除:从机模式下,USB设备没有这样的中断功能(上述 ...

  2. LWC-001_Event

    文章来源: Events (lwc.dev) 1. 监控子组件的动作: Child.html <template> <button>Click</button> & ...

  3. jekins+svn

    1.jekins安装可以看jekins+shell随笔. 2.安装svn. yum -y install subversion 3.配置相关文件 mkdir   家目录 cd 到家目录修改conf下三 ...

  4. HCIP-ICT实战进阶06-BGP基础

    HCIP-ICT实战进阶06-BGP基础 0 前言 运营商内部网络通过RIP.OSPF.ISIS实现网络互联, 但运营商之间要怎么办? 能不能互相引入路由? 理论上可行, 但考虑到网络机密问题和内部路 ...

  5. VS2015+QT5.10项目中文乱码

    解决:文件-高级保存选项,选择utf-8编码.

  6. 0.96OLED软件实现DMA串口接收数据模拟滚屏效果

    实现的滚屏效果是当一屏写满时,则清空从开头接着写,不是上移的滚屏,虽然OLED有滚屏命令,但是会带水平位移效果,并且只能提前写好数据,类似于广告牌循环播放的那种. 首先是为OLED屏划分区域. 我选择 ...

  7. Qt设置程序图标

    修改.pro文件添加一下代码:要求.pro文件和.ico文件在同一文件夹下 RC_ICONS = xxx.ico (你的程序图标)最后重新构建一次即可

  8. administrator 启用

    net user administrator /active:yes

  9. Python的入门学习Day 10~13——form”夜曲编程“

    Day 10 time:2021.8.7. ​ 今天本来打算学习时发现手机应该拿去充电了,再上完J课程之后发现时间确实只留到了晚上呢 .但幸好,以我多天的敲代码的牢固根基(哈哈哈),我最终还是弥补回来 ...

  10. pands 编码知识

    一,pandas功能 1,基于numpy , 分析结构化数据. 二,常用基础知识编码练习 包括数据类型,数据操作,比如索引,分片 ,分组聚合 ,排序 过滤等等数分常见操作代码 # coding=utf ...