衡阳网站开发培训,青岛网站快速排名提升,小型网站的建设与开发,音乐网站网页设计GC
GC 全称为garbage collection,中文含义为垃圾回收#xff0c;在jvm中的含义为回收无用内存空间
Young space
中文名为年轻代或者新生代#xff0c;为JVM 堆的一部分#xff0c;由分代GC概念划分而来#xff0c;保存生命周期较短的对象
Tenured space
中文名为老年代…GC
GC 全称为garbage collection,中文含义为垃圾回收在jvm中的含义为回收无用内存空间
Young space
中文名为年轻代或者新生代为JVM 堆的一部分由分代GC概念划分而来保存生命周期较短的对象
Tenured space
中文名为老年代或年老代为JVM 堆的一部分由分代GC概念划分而来保存生命周期较长的对象
Minor GC
minor gc指的是发生在年轻代或者说新生代Young space中的gc也有人称其为young gc或者ygc,在下文中我们统一使用minor gc表示
Major GC
major gc指的是发生在老年代Tenured space中的gc也有人称为old gc,o gc,cms gc等在下文我们统一使用major gc表示
stop the world
指的是用户线程在运行至安全点safe point或安全区域safe region之后就自行挂起进入暂停状态对外的表现看起来就像是全世界都停止运转了一样,而不论何种gc算法不论是minor gc还是major gc都会stop the world区别只在于stop the world的时间长短。
什么是Full GC
先说一下结论Full GC这个概念是没有官方定义的而且含义还特别混乱在不同地方表达的含义是不同的需要就不同的场景分别进行讨论。
大众认知上
在通常意义上人们口中说的Full GC为一次特殊GC行为的描述这次GC会回收整个堆的内存包含老年代新生代metaspace等这个是最常见的一种认知很多人也就了解到这个程度因此在遇到一些特殊场景的时候就会发现实际情况和自己的认知会发生冲突
从GC日志上
在gc.log中会发现在部分gc日志头中也有Full GC这样的字眼这里表示的含义是在这次GC的全过程中都是Stop The world的状态也就是说在这次GC的全过程中所有用户线程都是处于暂停的状态那么在这里要喷一下中文jvm神书《深入理解JVM》了在第二版第89页有这么一段话
GC 日志开头的“[GC”和“[Full GC”说明了这次垃圾收集的停顿类型而不是用来区分新生代GC还是老年代GC的。如果有“Full”说明这次GC是发生了Stop-The-World的例如下面这段新生代收集器ParNew的日志也会出现“[Full GC”这一般是因为出现了分配 担保失败之类的问题 .所以才导致STW)。如果是调用System.gc()方法所触发的收集那么在这里将显示“[Full GC (System)”。
这段话的描述是错误的因为在前面说过不论何种gc算法不论新生代或是老年代其gc都会发生stop the world这里正确的描述是这次GC的全过程都是Stop-The-World的
从JDK自带的工具上
使用jstat -gc命令能够查看到制定java 线程的gc次数那么在经过我的多次尝试以及对比之后我发现了使用jstat 查出来的FGC 次数和时间实际上指的是老年代的收集器发生Stop the world 的次数和持续时间对应本文而言就是CMS收集器的Stop the world次数和时间
其他含义坑爹版
前面不是说到我在监控大盘上看到这个应用平均一分钟发生了十多次”Full GC”么在我弄明白了前面两个Full GC的含义之后查看了gc.log文件随后发现该应用实际上一次Full GC都没有出现然后咨询了一下提供监控数据的同学结果他说是通过JMX获取的代码为
ManagementFactory.getGarbageCollectorMXBeans() 然后众所周知使用MXBean获取到的只是收集器的执行次数和Full GC半毛钱关系都没有啊随后在追问了一下发现做监控系统的同学直接把CMS收集器的收集次数当做了Full GC的次数来统计what the fuck只能说对于FUll GC的概念真的有很多人是一直没弄懂过的
结束语 在这篇文章快写完的时候用google随便搜了一下就在首页找到一篇对于各类gc概念介绍得比较透彻的文章和使用度娘一搜首页全是各种抄来抄去的错误文章相比对比简直是太强烈了由此得出结论技术类的资料能在外网查就在外网查吧省时又省力最后附上我找到的这篇文章貌似还是plumbr的联合创始人写的不得不说很给力了