JVM详解:垃圾回收机制
accttodo 12/31/2023 应用模板
目录
参考:
# 垃圾回收的定义
什么是垃圾?
垃圾是指在运行程序中没有任何指针指向的对象,这样的对象就是需要被回收的垃圾。 如果不及时对内存中的垃圾进行清理,那么,这些垃圾对象所占的内存空间会一直被占用保留,被占用保留的内存空间将无法被其他对象使用。
为什么需要垃圾回收(Garbage Collection,GC)?
不管我们写什么语言,我们都需要向内存当中分配对象。然而,所有语言都会面临一个问题:当我使用完对象之后,我们需要把它回收掉,释放内存空间。
- 如果不进行垃圾回收,内存会被消耗用尽。因为不断地分配内存空间而不进行回收,就好像不停地生产生活垃圾而从来不打扫一样。
- 垃圾回收可以清除内存里的记录碎片。碎片整理将所占用的堆内存移到堆的一端,以便 JVM 将整理出的内存分配给新的对象。
在C/C++中是手工回收。也就是需要开发人员自己回收内存。手工回收在调试程序的时候有巨大的困难。比如假设我们忘记了回收内存,别的变量就无法再占有这块内存,再比如我们判断失误多回收了一次,就会造成不可预估的损失。
在 java 中是自动回收。也就是设置一个垃圾管理员来完成回收任务。将开发人员从繁重的内存管理释放出来,专心业务开发。无需开发人员手动参与内存分配与回收,这样降低内存溢出和内存泄漏的风险。
- 内存溢出(Out Of Memory):内存剩余的空间无法满足存储新创建的对象,内存不够溢出。(去蹲坑发现坑位满了)
- 内存泄漏(Memory Leak):内存中的对象不被使用了,但又没有被回收释放,导致内存空间浪费。(通俗说法就是有人占着茅坑不拉屎。)例如:IO流不使用了但是没有被close、数据库连接 JDBC 不使用了没有被close。这些对象不会被回收就会占据内存,大量的此类对象存在,也是导致内存溢出的原因。
# 如何进行垃圾回收?
定位垃圾
当我们要回收内存当中的垃圾的时候,首先需要定位垃圾的位置,常用的垃圾定位算法有两种: