
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
Java编程开发语言随着互联网的不断发展而被越来越多的程序员掌握,今天我们就通过案例分析来简单了解一下,Java垃圾回收机制应用基础知识分享。
GC
JVM进行GC时,并非每次都对新生代、老年代、方法区(永久代、元空间)这三个区域一起回收,大部分回收是指新生代。
针对HotSpotVM的实现,它里面的GC按照回收区域又分为两大种类型:一种是部分收集(PartialGC),一种是整堆收集(FullGC)
PartialGC
部分收集:不是完整收集整个Java堆的垃圾收集。其中又分为:
新生代收集(MinorGC/YoungGC):只是新生代的垃圾收集;
老年代收集(MajorGC/OldGC):只是老年代的垃圾收集;
混合收集(MixedGC):收集整个新生代以及部分老年代的垃圾收集,只有G1GC(按照region划分新生代和老年代的数据)会有这种行为。
目前,只有CMSGC会有单独收集老年代的行为;很多时候MajorGC会和FullGC混淆使用,需要具体分辨是老年代回收还是整堆回收。
FullGC
整堆收集(FullGC):整个java堆和方法区的垃圾收集。
触发机制
年轻代GC(MinorGC)触发机制
当年轻代空间不足时,就会触发MinorGC,这里的年轻代满指的是Eden代满,Survivor满不会引发GC。(每次MinorGC会清理年轻代的内存,Survivor是被动GC,不会主动GC)
因为Java对象大多都具备“朝生夕灭”的特性,所以MinorGC非常频繁,一般回收速度也比较快。
MinorGC会引发STW(StopTheWorld),暂停其他用户的线程,等垃圾回收结束,用户线程才恢复运行。
老年代GC(MajorGC/FullGC)触发机制
指发生在老年代的GC,对象从老年代消失时,MajorGC或者FullGC发生了;
出现了MajorGC,经常会伴随至少一次的MinorGC(不是绝对的,在ParallelScavenge收集器的收集策略里就有直接进行MajorGC的策略选择过程),也就是老年代空间不足时,会先尝试触发MinorGC。如果之后空间还不足,则触发MajorGC;
MajorGC速度一般会比MinorGC慢10倍以上,STW时间更长;
如果MajorGC后,内存还不足,就报OOM了。
FullGC触发机制
触发FullGC执行的情况有以下五种:
调用System.gc()时,系统建议执行FullGC,但是不必然执行;
老年代空间不足;
方法区空间不足;
通过MinorGC后进入老年代的平均大小小于老年代的可用内存;
由Eden区,SurvivorS0(from)区向S1(to)区复制时,对象大小大于ToSpace可用内存,则把该对象转存到老年代,且老年代的可用内存小于该对象大小。
FullGC是开发或调优中尽量要避免的,这样暂停时间会短一些。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei456学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。