当前位置: 首页 > 网络学院 >

Java虚拟机详解----GC算法和种类

新客网 XKER.COM 时间:2015-08-20 11:22:34来源:昵称:生命壹号 博客园  评论:

本文主要内容:

  • GC的概念

  • GC算法

  引用计数法(无法解决循环引用的问题,不被java采纳)

根搜索算法

现代虚拟机中的垃圾搜集算法:

标记-清除

复制算法(新生代)

标记-压缩(老年代)

分代收集

  • Stop-The-World

一、GC的概念:

  • GC:Garbage Collection 垃圾收集

  • 1960年 Lisp使用了GC

  • Java中,GC的对象是Java堆和方法区(即永久区)

我们接下来对上面的三句话进行一一的解释:

(1)GC:Garbage Collection 垃圾收集。这里所谓的垃圾指的是在系统运行过程当中所产生的一些无用的对象,这些对象占据着一定的内存空间,如果长期不被释放,可能导致OOM

在C/C++里是由程序猿自己去申请、管理和释放内存空间,因此没有GC的概念。而在Java中,后台专门有一个专门用于垃圾回收的线程来进行监控、扫描,自动将一些无用的内存进行释放,这就是垃圾收集的一个基本思想,目的在于防止由程序猿引入的人为的内存泄露

(2)事实上,GC的历史比Java久远,1960年诞生于MIT的Lisp是第一门真正使用内存动态分配和垃圾收集技术的语言。当Lisp还在胚胎时期时,人们就在思考GC需要完成的3件事情:

哪些内存需要回收?

什么时候回收?

如何回收?

(3)内存区域中的程序计数器、虚拟机栈、本地方法栈这3个区域随着线程而生,线程而灭;栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈的操作,每个栈帧中分配多少内存基本是在类结构确定下来时就已知的。在这几个区域不需要过多考虑回收的问题,因为方法结束或者线程结束时,内存自然就跟着回收了

Java堆和方法区则不同,一个接口中的多个实现类需要的内存可能不同,一个方法中的多个分支需要的内存也可能不一样,我们只有在程序处于运行期间时才能知道会创建哪些对象,这部分内存的分配和回收都是动态的,GC关注的也是这部分内存,后面的文章中如果涉及到“内存”分配与回收也仅指着一部分内存。

如果本文对您有帮助请分享给您的好友,也可按Ctrl+D收藏本页面,谢谢!感谢本文来源方:昵称:生命壹号 博客园

评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)