黑马程序员技术交流社区

标题: 对Java GC机制的一些理解 [打印本页]

作者: 专注的一批    时间: 2020-7-22 17:41
标题: 对Java GC机制的一些理解
对Java GC 机制的一些理解
使用Java快一年时间了,从最早大学时候对Java的憎恶,到逐渐接受,到工作中体会到了Java开发的各种便捷与福利,这确实是一门不错的开发语言。不仅是 Intellij开发Java程序的爽快,还有无需手动管理内存的便捷、 Maven管理依赖的整洁、 SpringCloud大礼包的规整等等。
所以,作为一个有追求的Java程序员,深入底层掌握 GC(垃圾回收)的机制,应该算是必备的技能了。本文即XM返佣https://www.kaifx.cn/broker/xm.html我在学习过程中的一些个人观点以及心得,不正之处敬请指正。
JVM的运行数据区
首先我简单来画一张 JVM的结构原理图,如下。

image
我们重点关注 JVM在运行时的数据区,你可以看到在程序运行时,大致有5个部分。
1、方法区
不止是存“方法”,而是存储整个 class文件的信息,JVM运行时,类加载器子系统将会提取 class文件里面的类信息,并将其存放在方法区中。例如类的名称、类的类型(枚举、类、接口)、字段、方法等等。

2、堆( Heap)

熟悉 c/c++编程的同学们应该相当熟悉 Heap了,而对于Java而言,每个应用都唯一对应一个JVM实例,而每一个JVM实例唯一对应一个堆。堆主要包括关键字 new的对象实例、 this指针,或者数组都放在堆中,并由应用所有的线程共享。堆由JVM的自动内存管理机制所管理,名为垃圾回收—— GC(garbage collection)。
在Java中对象都是都JVM帮助管理的,那什么时候对象才会被回收,答案就是对象成为了垃圾对象,就是没有被引用的对象。怎么确定是否被引用呢?有两种方式
计数法
给每个对象中添加一个引用计数器,每当有地方引用它时,计数器值就加一;当引用失效时,计数器值就减一;计数器为0的对象就是可以回收的对象。

这个方法的优点就是速度很快,效率高,但是这个方法有个循环引用的问题。循环依赖的对象计数没有其他对象引用了,但是计数也不是零,因此不会被回收。






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2