拉圾回收概述
什么是垃圾
为什么需要GC
想要学习GC,首先需要理解为什么需要GC/p>
对于高级语言来说,一个基本认知是如果不进行垃圾回收,内存迟早都会被消耗完,因为不断地分配内存空间而不进行回收,就好像不停地生产生活垃圾而从来不打扫一样。
除了释放没用的对象,垃圾回收也可以清除内存里的记录碎片。碎片整理将所占用的堆内存移到堆的一端,以便JVM将整理出的内存分配给新的对象。
随着应用程序所应付的业务越来越庞大、复杂,用户越来越多,没有GC就不能保证应用程序的正常进行。而经常造成STW的GC又跟不上实际的需求,所以才会不断地尝试对GC进行优化。
早期垃圾回收
在早期的C/C++时代,垃圾回收基本上是手工进行的。开发人员可以使用new关键字进行内存申请,并使用delete关键字进行内存释放。比如以下代码:
Java垃圾回收机制
自动内存管理,无需开发人员手动参与内存的分配与回收,这样降低内存泄漏和内存溢出的风险
没有垃圾回收器,java也会和cpp一样,各种悬垂指针,野指针,泄露问题
让你头疼不已。
自动内存管理机制,将程序员从繁重的内存管理中释放出来,可以更专心地专注于业务开发
担忧(对于java开发人员)
对于Java开发人员而言,自动内存管理就像是一个黑匣子,如果过度依赖于“自动”,那么这将会是一场灾难,最严重的就会弱化Java开发人员在程序出现内存溢出时定位问题和解决问题的能力。
此时,了解JVM的自动内存分配和内存回收原理就显得非常重要,只有在真正了解JVM是如何管理内存后,我们才能够在遇见outofMemoryError时,快速地根据错误异常日志定位问题和解决问题。
当需要排查各种内存溢出、内存泄漏问题时,当垃圾收集成为系统达到更高并发量的瓶颈时,我们就必须对这些“自动化”的技术实施必要的监控和调节。
java代码解释 没有使用引用计数算法
结论:
由GC打印信息的,代码中的循环依耐的对象被GC回收了,反向说明java不是使用的引用计数算法来判断对象存活
图示
如果不下小心直接把Obj1-reference和obj2-reference置null。则在Java堆当中的两块内存依然保持着互相引用,无法回收。
GC Roots
在Java 语言中,GC Roots包括以下几类元素:
虚拟机栈中引用的对象
比如:各个线程被调用的方法中使用到的参数、局部变量等。
本地方法栈内JNI(通常说的本地方法)引用的对象
方法区中类静态属性引用的对象
比如: Java类的引用类型静态变量
方法区中常量引用的对象
比如:字符串常量池((string Table)里的引用
所有被同步锁synchronized持有的对象
Java虚拟机内部的引用。
基本数据类型对应的class对象,一些常驻的异常对象(如:NullPointerException、outofMemoryError),系统类加载器
反映java虚拟机内部情况的JMXBean、JVMTI中注册的回调、本地代码缓存等。
③ 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。
可通过以下方法捕获heap dump:
在左侧“Application”(应用程序)子窗口中右击相应的应用程序,选择Heap Dump(堆Dump) 。
在Monitor(监视)子标签页中点击Heap Dump(堆Dump)按钮。
本地应用程序的Heap dumps作为应用程序标签页的一个子标签页打开。同时,heap dump在左侧的Application(应用程序)栏中对应一个含有时间戳的节点。右击这个节点选择save as (另存为)即可将heap dump保存到本地。
MAT打开另存为的dump文件
JProfiler
idea 安装JProfiler 请自行百度

使用JProfiler 查看OOM
-XX:+HeapDumpOnOutOfMemoryError 这个参数的意思就是当出现OOM的时候,就会生成一个heap的dump文件
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!