码迷,mamicode.com
首页 > 其他好文 > 详细

jvm探秘之三:GC初步

时间:2015-10-13 00:15:14      阅读:183      评论:0      收藏:0      [点我收藏+]

标签:

         GC即垃圾收集器,虚拟机的必要组成部分。

         不过这里说当然是,hotspot虚拟机(jvm的主要版本)的GC机制,前面说过了jvm的组成部分,那么想当然GC只需要负责方法区和堆就好了,虚拟机栈、本地方法栈、程序计数器随线程而生,随线程而死,为毛要回收内存?

          先说堆,它分为新生代和老生代,这两个东西貌似没说过,这里说一下。为了便于管理和维护,写出更优化的内存管理,jvm将堆分为新生代和老生代,新生代存储的大多都是朝生夕死的对象实例,通过众多的实验证明,一个程序的运行中这种实例往往很多,他们存在不了多少时间,所以放在新生代就够了。这就说明了一个对象被实例化之后往往都是放在新生代,如果长时间回收不掉,它依然坚挺,那么这个对象实例就会进入老生代长久保存。堆分代的重要性和实用性特别明显,减去了大量的不必要的GC时间。

          标记对象:可达性分析算法

          当新生代到达了某种条件,jvm将自动启动GC,首先,GC将创建若干个“GC Roots"对象作为回收起点,通过这些起点遍历所有通过引用能到达的实例,就像遍历一张图一样,那些没有被遍历到的点,就是孤点没有用处了,那么什么东西可以作为”GC Roots"呢? 嘿嘿,想一想就马上出答案了,就是常量池和虚拟机栈变量表里的那些对象引用啊!这个思想很简单,用来标记对象是否可清除。

         新生代算法:复制算法

         这是目前新生代GC主流算法,大意是将新生代分为两块,一块使用,另一块被保留,当内存不够时,便触发GC将有用的实例复制到被保留的那块内存去,然后便整块擦除。由于只有少量的对象得到保存,所以这种算法运行起来快了许多。

         老生代算法:标记-整理算法

         

         

jvm探秘之三:GC初步

标签:

原文地址:http://www.cnblogs.com/liboyan/p/4873211.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!