JVM堆内存划分
新生代(YoungGeneration)
新生代内被划分为三个区:Eden,fromsurvivor,tosurvivor。大多数对象在新生代被创建。MinorGC针对的是新生代的垃圾回收。
老年代(OldGeneration)
在新生代中经历了几次MinorGC仍然存活的对象,就会被放到老年代。MajorGC针对的是老年代的垃圾回收。本文重点分析的CMS就是一种针对老年代的垃圾回收算法。另外FullGC是针对整堆(包括新生代和老年代)做垃圾回收的。
永久代(Perm)
主要存放已被虚拟机加载的类信息,常量,静态变量等数据。该区域对垃圾回收的影响不大,本文不会过多涉及。
CMS垃圾回收的6个重要阶段
initial-mark初始标记(CMS的第一个STW阶段),用于标记GC根直接引用的对象。GCRoot直接引用的对象并不多,因此速度非常快。
initial-mark并发标记阶段,从第一个阶段中标记的对象开始,在此阶段中标记所有可到达的对象。
concurrent-preclean并发预清理阶段也是并发执行阶段。在此阶段,它将在上一阶段的执行过程中寻找从新一代升级,新分配或更新的对象。通过同时重新扫描这些对象,预清理阶段可以减少下一个世界停止标记阶段的工作量。
concurrent-preclean并发可终止预清洗阶段。该阶段实际上与上一阶段相同,但是也减少了下一个STW重新标记阶段的工作量。添加此阶段是为了允许我们控制此阶段结束的时间,例如扫描需要多长时间(默认5秒)或伊甸园区域使用率达到所需比例(默认50%)才能结束此阶段。
remark重标记阶段(CMS的第二个STW阶段),挂起所有用户线程,重新扫描GC根目录中的整个堆,并标记尚存的对象。应该注意的是,尽管CMS只回收旧一代中的垃圾对象,但在此阶段它仍需要扫描年轻一代,因为许多GC根都在年轻一代中,而这些GC根所指向的对象在旧一代中。老一辈。世代参考”。
concurrent-preclean,并发清理。
推荐阅读:jvm培训:如何判断哪些对象需要回收?
如果你想了解更多关于java架构师的专业知识,可以加入JAVA架构师交流群:1037935907,里面都是同行,有资源分享包括但不限于(分布式架构、高可扩展、高性能、高并 发、Jvm性能调优、Spring,MyBatis,Nginx源码分析,Redis,ActiveMQ、、Mycat、Netty、Kafka、Mysql 、Zookeeper、Tomcat、Docker、Dubbo、Nginx)。欢迎一到五年的工程师加入,合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!