首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

JVM渣滓收集机制流程

2012-08-22 
JVM垃圾收集机制流程???? 本来想一次性将java虚拟机上的垃圾回收机制弄懂的,看了几篇关于这方面的文章之后

JVM垃圾收集机制流程

???? 本来想一次性将java虚拟机上的垃圾回收机制弄懂的,看了几篇关于这方面的文章之后发现,要想把这一方面的知识全部弄清楚还需要深入研究吖!下面就先将JVM垃圾回收的机制大致的说一下吧!

???? 不知道大家是否还记得java中栈和堆的概念,栈是java程序运行时用的,它可以展示性的存放一些临时变量,堆就是用来存放数据的,栈中的变量指向堆地址中的数据,首先让我们全面看一下JVM的结构框架图吧:

????
JVM渣滓收集机制流程
????? 上篇博客里面写到了类加载器,现在来讲讲堆吧!正因为java中将栈和堆的概念分开了,才会出现垃圾回收的机制,因为每次创建一个新的对象就要在对中开辟一块内存将其储存起来!

????? java中垃圾收集简称GC(garbage?collection),JVM中的堆中储存着正在运行的应用程序所建立的所有对象,这些对象通过new、newarray、anewarray和multianewarray等指令建立,是由于有内存的限制,JVM中才实现由垃圾回收所管理的堆。

?? 堆空间又划分三个代,年轻代、年老代、永久代,这个是按照不同的对象按照不同的生命周期来划分的,从字面上就可以看出,年轻代存放的对象的生命周期最短,年老代存放的对象的生命周期比较长,永久代存放的对象的生命周期是最长的,像什么静态(static)对象等。年轻代由分为eden和两个survivor区间,两个survivor的大小是一样的。如图所示:

??
JVM渣滓收集机制流程
?JVM垃圾回收机制大致是这样的:

??1、创建一个对象在eden中进行内存分配

? 2、当eden内存不够的时候,就会进行垃圾回收,触发minorGC(有的称scavenger GC)机制,在eden和一个survivor区间进行垃圾回收

? 3、在进行minorGC的时候,是将eden和一个survivor中还存活的对象放在另一个空的survivor中,再清空之前的eden和survivor,这两个survivor必须保证有一个为空

? 4、当完成第3步之后,后面加进来的新的对象将这个survivor占满了的时候,再将survivor中的对象copying到old generation区段

? 5、当old generation也满了的时候,再进行全面的垃圾回收(full GC),即将young generation、old generation和permanent generation进行清理

?

将JVM垃圾回收机制的流程之后,我们主要是要对其进行优化,因为

垃圾收集的一大缺陷是:它的开销影响程序性能,为了提高垃圾收集的效率,其关键要素是minorGC和fullGC阶段,同时还有堆中各个部分的大小也影响着垃圾收集的效率,换句话说,垃圾收集机制的核心就是算法和JVM各参数的设置,目前我还在研究当中。。。

<!--EndFragment-->

1 楼 风子柒 2012-03-04   创建对象时是怎么知道应该放在年轻代还是年老代呢? 2 楼 风子柒 2012-03-04   风子柒 写道创建对象时是怎么知道应该放在年轻代还是年老代呢?
好吧,了解了。谢谢LZ。 3 楼 风子柒 2012-04-01   持久代不是在堆里的。
方法区对应持久代,堆对应年轻代和年老代吧。 4 楼 bearsorry 2012-04-05   风子柒 写道持久代不是在堆里的。
方法区对应持久代,堆对应年轻代和年老代吧。
     在java堆和方法区里面都会有,就像常量池一样,如果是实例化一个static的对象,那么这个对象既会在堆里面提供存储空间又会在方法区中常量池里面进行存储。。。

热点排行