浅谈JavaGc(垃圾回收)机制

1 篇文章 0 订阅

最近在看<深入理解Java虚拟机:JVM高级特性与最佳实践>一书其中谈到了Gc机制其实之前对于java的Gc机制是没有什么了解的。只是单纯的知道java有这么一个机制,对它是怎么处理的并不了解。

1.浅谈java内存区域

在java中内存区域分为方法区,堆,虚拟机栈,本地方法栈,程序计数器。这些区域有的随着虚拟机线程启动而存在,有的根据用户的线程启动而存在。但是内存是有限的如果内存过大就会出去内存泄露,或者内存溢出的异常。

2.Gc的发展

说起垃圾收集,大部分人把它当做java的附带品,但其实不是这样的,Gc的历史比java还要久远,1960诞生在MIT的lisp是第一门真正使用内存动态分配和垃圾收集机制的语言。也就是从那时起人们就在思考怎么使用Gc。

3.了解GC

了解Gc主要从三个方面来了解,哪些内存需要回收,什么时候回收,如何回收。

(1)哪些内存需要回收

在java中内存区域分为方法区,堆,虚拟机栈,本地方法栈,程序计数器。其中虚拟机栈,本地方法栈,程序计数器三个方法随线程而生随线程而灭,所以这三个区域的内存分配和回收都具有确定性,因此方法结束,线程结束,内存自然而然就回收了。但是堆中和方法区中的就不一样了,一个接口对应的实现类也不一样,一个方法多个分支也不一样。只有在程序运行时才知道哪些需要回收。所以这部分的回收都是动态的。我们关注的就是这些内存。

(2)什么时候回收

堆中几乎存放着java世界中所有对象,垃圾回收在对堆中的对象回收前,第一件事就是要确定哪些对象活着,哪些死了(即不可能再被任何途径使用的对象)
java中使用根搜索算法来判断对象是否存活。以GCROOT对象为起点,从这些节点往下搜索,搜索对象走的路径为引用链,当一个对象到GCROOT中没有任何引用对象时(即从GCROOT到和这个对象不可达),则证明这个对象是不可用的。这边引用书中原话
1.png

(3)如何回收

GC是使用垃圾回收器以及算法来回收内存的。这边的话就不细细讨论算法了以标记——清除算法为例
2.png
此外还有复制算法,标记整理算法等等。
算法是垃圾回收的理论,垃圾收集器则是具体的实现,不同版本的虚拟机都会有很大的区别。所以这边就不一一讨论了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值