来源:http://suhuanzheng7784877.iteye.com/blog/2026290
1):资深串行GC,学名是Serial Old。这个和Eden带的串行回收意思差不多,也是基于单线程的,停止运行程序的。无非在回收算法的细节上进行了改动。Eden区域是采用的复制算法,而在此Old空间,因为Old空间的特性,其空间相对来说比较大。所以再回收的时候采用了标记-压缩的方式。读者可以联想一下咱们的Windows的磁盘整理,硬盘使用了一段时间后进行磁盘扫描是不是会出现很多不连续的空余空间,定期做一次磁盘扫描将已经使用的空间连续起来,不使用的空间腾出来,这样对于CPU去硬盘上读取文件,空间利用率上更加方便和快捷,在这里Old串行GC采用这种算法,也是这个道理也是这个道理。不过要说明一点就是采用此算法花费的时间要长一些。所以这也是为什么Full
GC比较耗时的原因之一。
2):资深并行GC,这个和Eden的并行GC也没太大区别,除了在具体细节算法上和一般并行有区别外,其他并无太大变化,相当于多线程的资深串行GC。
3):资深并发GC,学名是Concurrent Mark Sweep GC(简称CMS GC),从名字中大家可能猜到了,这是在Old区域采用并发的方式进行回收,在整个CMS GC过程中,要经过多个阶段扫描并标记识别对象是否真正要回收,在整个扫描,标记的阶段过程中,只有极小一段时间处于应用程序中断的状态,其他标记阶段都是同时和应用程序一同工作着的。在某点上(比如压缩时)一般都不得不停止其他操作以完成特定的任务,但是因为其他应用程序可进行其他的后台操作,所以中断其他处理的实际时间大大降低。在Old带采用此策略GC的时候,关系到整个堆的命运,在Eden带必须使用ParNew的方式进行GC,否则Old带的GC会受到Eden的GC影响,导致整个堆区域的GC效率下降。
各位看到了,公司面对不同时期的员工,有着不同的策略收拾这些“人才”,确确实实揭露了一个事实,当你对公司没有用处的时候,他总会有机会,有办法,有理由,有借口,有手段让你离开的。毕竟长江后浪推前浪嘛,前浪早晚得死在沙滩上。
对于Full GC的概念其实是这样的,Full GC干了什么事呢?它将Eden区、幸存区、Old区,乃至非对区域的方法区(持久带),不同区域采取不同策略,都进行了相关的GC。所以咱们微观地看来,面对这么多区域,又有标记啦、扫描啦、停止运行程序啦等等一些列的动作都是需要很长时间的这也是为什么说Full GC在大多数情况下最好少触发。哪个公司也不愿意过个一两天就进行人事大换血,大调用,都愿意稳定。
还要交代一句的就是Full GC的一些条件,上面只是说了一种情况下引发了Full GC,其实呢还有另外几种情况,就是当classloader加载完类信息后,方法区持久带的空间不足以容纳类信息了,那么也会触发一次Full GC;还有就是咱们之前提到的CMS GC回收策略,当Old带正在进行CMS GC的同时来了新的对象了,而此时此刻呢,很不巧,Old带有容纳不了这个新的大对象,此时就得审时度势了,得了,Full一把吧;还有就是经过几次Eden区、幸存区域、Old带的回收下来发现Minor GC后放到Old带的对象平均大小要大于Old的剩余空间,JVM认为这个不太合理,就Full
GC了,这算是一种JVM自我优化和保护的一种策略吧。
1. 总结
其实JVM管理内存的方式概念比较多,比如还可以深入到回收算法:拷贝、标记、压缩等等细节。这次咱暂时没有详细提起,仅仅是浅尝辄止,意在用通俗的语言让大家看看JVM到底如何进行分配资源和回收资源的。其实从中不难看出,一个JVM真的为咱们做了不少事情,就是为了不让开发人员手工回收自己开辟的资源,原来他在底层为我们默默的做了这么多事情。从中也能看出一些残酷的事实,还是时刻提醒我们,居安思危,无论身在多么好的企业、公司,最好有一种危机意识。效益在好的公司也有经历严酷寒冬的时候,说不定哪天公司的HR真的就像垃圾回收器(垃圾这个词~可能有点残酷,有点不近人情)一样,将他们认为无用的人员就给咔嚓了。无论你曾经有什么重大的贡献,请记住,那是曾经,不代表将来。这次笔者感觉JVM对于内存的管理比作公司,其实稍微有那么一点点勉强,毕竟现实生活中真正运作的公司谁也不敢那么做(有劳动法,公司再怎么牛也不敢像JVM这么绝决)。此时此刻倒是想起一段新闻,某某网去年一直高调招揽人才,很多人才都是通过猎头给出了比较吸引人的待遇,挖过去的,现在的形式大家都知道是团购网的寒冬时期,那个某某网又低调大手笔裁员。这个难道就是现实生活中JVM的垃圾回收的写照?