没有合适的资源?快使用搜索试试~ 我知道了~
本文摘自我们几周后即将出版的Garbage Collection Handbook一书的样章。同时也让你能熟悉下垃圾回收的基础知识——这选自该书的第一章。 乍一看,垃圾回收所做的事情应当恰如其名——查找并清除垃圾。事实上却恰恰相反。垃圾回收会跟踪所有仍在使用的对象,然后将剩余的对象标记为垃圾。牢记了这点之后,我们再来深入地了解下这个被称为“垃圾回收”的自动化内存回收在JVM中到底是如何实现的。 手动管理内存 在介绍现代版的垃圾回收之前,我们先来简单地回顾下需要手动地显式分配及释放内存的那些日子。如果你忘了去释放内存,那么这块内存无法重用了。这块内存被占有了却没被使用。这种场景
资源详情
资源评论
资源推荐
Java 垃圾回收机制概念梳理垃圾回收机制概念梳理
本文摘自我们几周后即将出版的Garbage Collection Handbook一书的样章。同时也让你能熟悉下垃圾回收的基础知识
——这选自该书的第一章。
乍一看,垃圾回收所做的事情应当恰如其名——查找并清除垃圾。事实上却恰恰相反。垃圾回收会跟踪所有仍在使用的对
象,然后将剩余的对象标记为垃圾。牢记了这点之后,我们再来深入地了解下这个被称为“垃圾回收”的自动化内存回收在JVM
中到底是如何实现的。
手动管理内存
在介绍现代版的垃圾回收之前,我们先来简单地回顾下需要手动地显式分配及释放内存的那些日子。如果你忘了去释放内
存,那么这块内存无法重用了。这块内存被占有了却没被使用。这种场景被称之为内存泄露。
下面是用C写的一个手动管理内存的简单例子:
int send_request(){
size_t n=read_size();
int*elements=malloc(n*sizeof(int));
if(read_elements(n,elements)<n){
//elements not freed!
return-1;
}
//…
free(elements)
return 0;
}
可以看到,你很容易会忘了释放内存。内存泄露曾经是个非常普遍的问题。你只能通过不断地修复自己的代码来与它们进
行抗争。因此,需要有一种更优雅的方式来自动释放无用内存,以便减少人为错误的可能性。这种自动化过程又被称为垃圾回
收(简称GC)。
智能指针
自动垃圾回收早期的一种实现便是引用计数。你知晓每一个对象被引用了几次,当计数器归0的时候,这个对象可以被安
全地回收掉了。C++的共享指针是一个非常的例子:
int send_request(){
size_t n=read_size();
stared_ptr<vector<int>>elements
=make_shared<vector<int>>();
if(read_elements(n,elements)<n){
return-1;
}
return 0;
}
我们使用的sharedptr会记录这个对象被引用的次数。如果你将它传递给别人则计数加一,当它离开了作用域后便会减
一。一旦这个计数为0,sharedptr会自动地删除底层对应的vector。当然这只是个示例,因为也有读者指出来了,这个在现实
中是不太可能出现的,但作为演示是足够了。
自动内存管理
在上面的C++代码中,我们还得显式地声明我们需要使用内存管理。那如果所有的对象都采用这个机制会怎样呢?那简直
太方便了,这样开发人员便无需考虑清理内存的事情了。运行时会自动知晓哪些内存不再使用了,然后释放掉它。也是说,它
自动地回收了这些垃圾。第一代的垃圾回收器是1959年Lisp引入的,这项技术迄今为止一直在不断演进。
引用计数
刚才我们用C++的共享指针所演示的想法可以应用到所有的对象上来。许多语言比如说Perl,Python以及PHP,采用的都
是这种方式。这个通过一张图可以很容易说明:
绿色的云代表的是程序中仍在使用的对象。从技术层面上来说,这有点像是正在执行的某个方法里面的局部变量,亦或是
静态变量之类的。不同编程语言的情况可能会不一样,因此这并不是我们关注的重点。
蓝色的圆圈代表的是内存中的对象,可以看到有多少对象引用了它们。灰色圆圈的对象是已经没有任何人引用的了。因
此,它们属于垃圾对象,可以被垃圾回收器清理掉。
看起来还不错对吧?没错,不过这里存在着一个重大的缺陷。很容易会出现一些孤立的环,它们中的对象都不在任何域
内,但彼此却互相引用导致引用数不为0。下面便是一个例子:
weixin_38555019
- 粉丝: 10
- 资源: 921
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0