文章目录

  • 1.浅谈java内存区域
  • 2.Gc的发展
  • 3.了解GC
  • (1)哪些内存需要回收
  • (2)什么时候回收
  • (3)如何回收


最近在看<深入理解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到和这个对象不可达),则证明这个对象是不可用的。这边引用书中原话
(3)如何回收
GC是使用垃圾回收器以及算法来回收内存的。这边的话就不细细讨论算法了以标记——清除算法为例

此外还有复制算法,标记整理算法等等。

算法是垃圾回收的理论,垃圾收集器则是具体的实现,不同版本的虚拟机都会有很大的区别。所以这边就不一一讨论了。