Why GC

GC还未出现的时代

在自动垃圾回收概念出来之前的那个时代,大部分程序都是用诸如C语言这样的程序语言来编写的,而在C或者CPP语言中,所有的内存分配和回收都必须要开发人员手动处理,以C为例:

申请空间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdlib.h>
#include <string.h>

typedef struct {
int id;
char *name;
int age;
} RugalType;

RugalType* p = malloc(sizeof(RugalType));

memset(p, 0, sizeof(RugalType));
p.id = 18;
p.name = malloc(sizeof(char) * 10);
strncpy(p.name, "Rugal", 5);

以上代码列举了如何申请一片内存空间并赋值给p指针, 然后又分配了10个字节的空间用来给p.name指针.

释放空间

1
2
3
4
5
6
if (NULL != p) {
if (NULL != p.name) {
free(p.name);
}
free(p);
}

以上C代码就是正常的释放/返回空间的例子.
正常情况下,所有申请的内存,都需要有序地被释放回去,否则就会发生内存泄漏.

内存泄漏

1
2
3
4
5
6
7
8
9
#include <stdlib.h>
// 给p指针分配内存
int *p = malloc(sizeof(int));
// 将p指向的内存的值赋值为1
*p = 1;
// p指针不指向任何内存
p = NULL;
// 从此开始,p指针不再指向原来的内存,而原来的内存空间已经没有任何指针能够访问到了
// 这样的情况我们称为内存泄漏

以上就是经典的内存泄漏的代码样例.
在这种情况下,这段内存就无法被任何方式方式到,而这块内存又已经被分配出去,因此系统不会自动将其回收回来.因此对于本程序来说,可用的内存空间就永远减少了4个字节.
长此以往的话,程序的可用内存就会越来越少,最终程序的内存耗竭,发生崩溃.
这是我们不希望看到的.

自动内存回收GC

对于开发人员来说,如果能随心所欲的创建对象,而不需要花精力去考虑内存的回收问题,那该有多好呀.基于这个初衷,自动内存回收的理念逐渐浮现出来.
自动内存回收/垃圾回收(GC)其实存在于很多语言中,包括但不限于,Java, JavaScript,Python,Ruby等等.

1
2
3
4
5
// 分配内存
var o = new Object();
// 从此开始该对象就不再有引用可以访问到它
o = null;
//在此后的某个时刻,GC应当能找到判断这个对象已经无法再访问,并释放它

本系列会以Java作为基础,讨论GC的概念,算法等.


Why GC
https://rug.al/2021/2021-09-26-why-gc/
Author
Rugal Bernstein
Posted on
September 26, 2021
Licensed under