JVM学习笔记之-拉圾回收概述,垃圾回收相关算法

拉圾回收概述

什么是垃圾

JVM学习笔记之-拉圾回收概述,垃圾回收相关算法

为什么需要GC

想要学习GC,首先需要理解为什么需要GC/p>

对于高级语言来说,一个基本认知是如果不进行垃圾回收,内存迟早都会被消耗完,因为不断地分配内存空间而不进行回收,就好像不停地生产生活垃圾而从来不打扫一样。

除了释放没用的对象,垃圾回收也可以清除内存里的记录碎片。碎片整理将所占用的堆内存移到堆的一端,以便JVM将整理出的内存分配给新的对象。

随着应用程序所应付的业务越来越庞大、复杂,用户越来越多,没有GC就不能保证应用程序的正常进行。而经常造成STW的GC又跟不上实际的需求,所以才会不断地尝试对GC进行优化。

早期垃圾回收

在早期的C/C++时代,垃圾回收基本上是手工进行的。开发人员可以使用new关键字进行内存申请,并使用delete关键字进行内存释放。比如以下代码:

JVM学习笔记之-拉圾回收概述,垃圾回收相关算法
现在,除了Java以外,C#、Python、Ruby等语言都使用了自动垃圾回收的思想,也是未来发展趋势。可以说,这种自动化的内存分配和垃圾回收的方式己经成为现代开发语言必备的标准。

Java垃圾回收机制

自动内存管理,无需开发人员手动参与内存的分配与回收,这样降低内存泄漏和内存溢出的风险

没有垃圾回收器,java也会和cpp一样,各种悬垂指针,野指针,泄露问题
让你头疼不已。

自动内存管理机制,将程序员从繁重的内存管理中释放出来,可以更专心地专注于业务开发

担忧(对于java开发人员)

对于Java开发人员而言,自动内存管理就像是一个黑匣子,如果过度依赖于“自动”,那么这将会是一场灾难,最严重的就会弱化Java开发人员在程序出现内存溢出时定位问题和解决问题的能力

此时,了解JVM的自动内存分配和内存回收原理就显得非常重要,只有在真正了解JVM是如何管理内存后,我们才能够在遇见outofMemoryError时,快速地根据错误异常日志定位问题和解决问题。

当需要排查各种内存溢出、内存泄漏问题时,当垃圾收集成为系统达到更高并发量的瓶颈时,我们就必须对这些“自动化”的技术实施必要的监控和调节

JVM学习笔记之-拉圾回收概述,垃圾回收相关算法

java代码解释 没有使用引用计数算法

JVM学习笔记之-拉圾回收概述,垃圾回收相关算法

结论:
由GC打印信息的,代码中的循环依耐的对象被GC回收了,反向说明java不是使用的引用计数算法来判断对象存活

图示

如果不下小心直接把Obj1-reference和obj2-reference置null。则在Java堆当中的两块内存依然保持着互相引用,无法回收。

JVM学习笔记之-拉圾回收概述,垃圾回收相关算法

GC Roots

在Java 语言中,GC Roots包括以下几类元素:
虚拟机栈中引用的对象

比如:各个线程被调用的方法中使用到的参数、局部变量等。

本地方法栈内JNI(通常说的本地方法)引用的对象

方法区中类静态属性引用的对象

比如: Java类的引用类型静态变量

方法区中常量引用的对象

比如:字符串常量池((string Table)里的引用

所有被同步锁synchronized持有的对象

Java虚拟机内部的引用。

基本数据类型对应的class对象,一些常驻的异常对象(如:NullPointerException、outofMemoryError),系统类加载器

反映java虚拟机内部情况的JMXBean、JVMTI中注册的回调、本地代码缓存等。

JVM学习笔记之-拉圾回收概述,垃圾回收相关算法

finalize()方法是对象逃脱死亡的最后机会,稍后cc会对F-Queue队列中的对象进行第二次标记。如果objA在finalize()方法中与引用链上的任何一个对象建立了联系,那么在第二次标记时,objA会被移出“即将回收”集合。之后,对象会再次出现没有引用存在的情况。在这个情况下,finalize方法不会被再次调用,对象会直接变成不可触及的状态,也就是说,一个对象的finalize方法只会被调用一次。

代码演示具体过程

MAT与JProfiler的GC Roots溯源

MAT

MAT是Memory Analyzer的简称,它是一款功能强大的Java堆内存分析器。用于查找内存泄漏以及查看内存消耗情况。

MAT是基于Eclipse开发的,是一款免费的性能分析工具。

大家可以在http://www.eclipse.org/mat/下载并使用MAT。

JVM学习笔记之-拉圾回收概述,垃圾回收相关算法
方式2:使用JVisualVM导出
捕获的heap dump文件是一个临时文件,关闭JVisualVM后自动删除,若要保留,需要将其另存为文件。

可通过以下方法捕获heap dump:

在左侧“Application”(应用程序)子窗口中右击相应的应用程序,选择Heap Dump(堆Dump) 。

在Monitor(监视)子标签页中点击Heap Dump(堆Dump)按钮。

本地应用程序的Heap dumps作为应用程序标签页的一个子标签页打开。同时,heap dump在左侧的Application(应用程序)栏中对应一个含有时间戳的节点。右击这个节点选择save as (另存为)即可将heap dump保存到本地。

JVM学习笔记之-拉圾回收概述,垃圾回收相关算法

MAT打开另存为的dump文件

JVM学习笔记之-拉圾回收概述,垃圾回收相关算法

JProfiler

idea 安装JProfiler 请自行百度

JVM学习笔记之-拉圾回收概述,垃圾回收相关算法

JVM学习笔记之-拉圾回收概述,垃圾回收相关算法

使用JProfiler 查看OOM

-XX:+HeapDumpOnOutOfMemoryError 这个参数的意思就是当出现OOM的时候,就会生成一个heap的dump文件

来源:努力敲代码买猪脚啃

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年6月1日
下一篇 2021年6月1日

相关推荐