参考链接: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. centos安装Jenkins报错

    [SKIPPED] jenkins-2.249.3-1.1.noarch.rpm: Already downloaded warning: /var/cache/dnf/jenkins-0919f06 ...

  2. iOS开发之UIImage在压缩时失真问题,压缩图片的大小

    今天遇到UIImage在压缩时失真问题,压缩图片的大小图片模糊 错误的方案 /** * 压缩图片 * image:将要压缩的图片 size:压缩后的尺寸 */ -(UIImage*) OriginIm ...

  3. SpringBoot 启动报循环依赖问题

    问题现象 Caused by: org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating b ...

  4. errgroup.Group

    在一组 Goroutine 中提供了同步.错误传播以及上下文取消的功能,我们可以使用如下所示的方式并行获取网页的数据: package main import ( "fmt" &q ...

  5. Spring框架3--Web

    Spring框架之Web Javaweb三大组件和四大域 顺便:Javaweb中的四大域,作用范围如下:PageContext<Request<Session<ServletCont ...

  6. flutter SafeArea和SliverSafeArea,适应特殊屏幕

    现如今的手机已经不能提供给应用程序规整的矩形界面了,一些带圆角或者是刘海屏让应用程序的布局更加复杂,甚至是需要单独适配,这对开发者来来太糟糕了. 因此SafeArea控件应用而生,SafeArea通过 ...

  7. 算法学习—————数位dp

    记忆化搜索版,比较有套路 就根据杠杆数这道题来回忆一下 题目大致意思:选定大数中的某个数作为支点,使左右两边的力矩和相等,求区间内能满足条件的数的个数 首先一个大前提:对于一个满足条件的数来说,他的支 ...

  8. webssh

    目录 使用 jupyter notebook 使用webssh GateOne 使用 jupyter notebook pip install jupyter ipyton # 启动 jupyter ...

  9. 山寨e网通公告

    SHANZGONGG山寨e网通V1.0[换行]软件完全免费,官方绝不会索取任何费用,请勿被骗,后果自负.[换行]如果你有什么更好的建议或者需要哪里改进的地方,请联系作者QQ206044600反馈,前提 ...

  10. django日志集成输出器

    在配置文件中 import os # ⽇志 LOGGING = { 'version': 1, # 自定义一个简单版本 'disable_existing_loggers': False, # 是否禁 ...