JVM之垃圾回收第二篇垃圾回收算法总体第十三篇

上一篇文章中已经大概解释了一下我们的java有的内存管理的内容垃圾方面的内容
上篇文章地址https://blog.csdn.net/weixin_46635575/article/details/122797073

1、垃圾标记阶段的算法之引用计数算法

(1)复习一下内存模型

在这里插入图片描述

垃圾回收是发生在我们的堆和元空间(元空间的Method Area),它两是线程共享的,一定要记住,“较多回收年轻代,较少回收老年代,基本不动方法区”。

(2)对象存活的判断

在这里插入图片描述

(2.1)垃圾标记阶段算法之引用计数算法

在这里插入图片描述

在这里插入图片描述

  • 我们java是没有采用这种方式【看下面案例分析】

    在这里插入图片描述

    设置参数

    在这里插入图片描述


    我们发现根本没有发生什么GC

    在这里插入图片描述


    当手动的System.gc()时候看到,再次运行

    在这里插入图片描述


    在这里插入图片描述


    由此证明我们java没有使用引用计数算法

Python则是通过如下来解决的。

在这里插入图片描述

(2.2)垃圾标记阶段算法之可达性分析算法

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述

(2.3)常见的GC Roots对象

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述

2、对象finalization机制

(1)方法使用介绍

在这里插入图片描述


在这里插入图片描述


用protected修饰的方法:它是可以被子类重写的。

在这里插入图片描述


在这里插入图片描述

(2)具体过程

java虚拟机内置了finalize线程,由它来触发我们的finalize()方法,优先级比较低,所以我们自己调用了,也很难启用,后面继续写到为什么不要主动去调用

在这里插入图片描述

(3)演示可复活对象

  • 首先看没有重写我们的finalize()方法的情况

    在这里插入图片描述


    在这里插入图片描述


    在这里插入图片描述


    在这里插入图片描述

  • 覆写我们的方法试一下

    在这里插入图片描述


    我们这样一写,导致它从新引用上了,最后它就不会死。

    在这里插入图片描述

3、MAT查看GC Roots

在这里插入图片描述

(1)获取dump文件

如果要用MAT查看GC Roots则需要dump文件。我们怎么获得dump文件呢?

  • 第一种方式(使用jmap)

    在这里插入图片描述

  • 第二种方式是通过JVisualVM导出

    在这里插入图片描述


    可能我此篇文章是第一次看到我写JVM笔记,可能不太知道JVisualVM,它是JDK自带的可视化工具,在如下目录

    在这里插入图片描述

    • 第一步选择我们的对应进程

      在这里插入图片描述

    • 第二步

      在这里插入图片描述


      在这里插入图片描述


      在这里插入图片描述

(2)使用MAT打开

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述

4、jprofiler查看GC Roots

首先下载jprofiler下载教程文章

在这里插入图片描述

(1)jprofiler分析OOM

在这里插入图片描述


有这个参数设置,就如果出现了OOM的时候,就会生成一个heap的dump文件,就在你当前模块里面。

在这里插入图片描述


在这里插入图片描述

相关文章

jinfo 命令可以用来查看 Java 进程运行的 JVM 参数,命令如下...
原文链接:https://www.cnblogs.com/niejunlei/p/5987611.ht...
java 语言, 开发者不能直接控制程序运行内存, 对象的创建都是...
jvm
1.jvm的简单抽象模型:  2.类加载机制     双亲委派模...
堆外内存JVM启动时分配的内存,称为堆内存,与之相对的,在代...
1.springboot和tomcat2.springcloud的请求如何通过网关鉴权?...