骄阳房地产网站,温州网趣电子商务有限公司,做标签网站邀请码,wordpress开发环境搭建GC#xff1a;Garbage Collectors 垃圾回收器 C/C#xff0c;手动回收内存#xff1b;难调试、门槛高。忘记回收、多次回收等问题 Java、Golang等#xff0c;有垃圾回收器#xff1a;自动回收#xff0c;技术门槛降低 一、如何定位垃圾#xff1f;
https://www.infoq.c…GCGarbage Collectors 垃圾回收器 C/C手动回收内存难调试、门槛高。忘记回收、多次回收等问题 Java、Golang等有垃圾回收器自动回收技术门槛降低 一、如何定位垃圾
https://www.infoq.cn/article/3wyretkqrhivtw4frmr3
https://juejin.cn/post/7123853933801373733
1、引用计数法
无法解决循环调用的问题
2、根可达分析算法
一般需要STWstop-the-world 二、哪些内存需要回收
运行期间动态创建的、内存分配和回收具有不确定性的堆、常量池方法区 三、常见的GC算法
标记清除算法、标记复制法、标记压缩法、分代收集算法
1、mark-sweep 标记清除法三色标记法
位置不连续 产生碎片 效率偏低两遍扫描 黑色区域表示待清理的垃圾对象标记出来后直接清空。该方法简单快速但是缺点也很明显会产生很多内存碎片。 2、mark-copy 标记复制法
没有碎片但浪费空间只能使用50%的内存 将内存对半分总是保留一块空着上图中的右侧将左侧存活的对象浅灰色区域复制到右侧然后左侧全部清空。避免了内存碎片问题但是内存浪费很严重相当于只能使用 50%的内存。 3、mark-compact 标记压缩法
没有碎片效率偏低两遍扫描指针需要调整 避免了上述两种算法的缺点将垃圾对象清理掉后同时将剩下的存活对象进行整理挪动类似于 windows 的磁盘碎片整理保证它们占用的空间连续这样就避免了内存碎片问题但是整理过程也会降低 GC 的效率。 4、generation-collect 分代收集算法
综合使用了标记清除、标记复制、标记压缩算法。堆内存逻辑分区新生代Young Generation、老年代Old GenerationYoung Genaration 更是又细为分 edenS0S1 三个区。 YGC/FGC过程 产生的新对象放eden区当 eden 区放不下时就会发生 minor GC也被称为 young GC标记不可达对象然后将可达对象移动到S0区清空eden区综合运用了“【标记-清理 eden】 【标记-复制 eden-s0】”算法eden 如果又满了再次触发 minor GC先做标记s0 区和 eden 区的存活对象将直接搬到 s1 区。然后将 eden 和 s0 区的垃圾清理掉对象在年青代的 3 个区(edge,s0,s1)之间每次从 1 个区移到另 1 区年龄1在 young 区达到一定的年龄阈值后将晋升到老年代如果老年代最终也放满了就会发生 major GC即 Full GC由于老年代的的对象通常会比较多因为【标记-清理-整理压缩】的耗时通常会比较长会让应用出现卡顿的现象这也是为什么很多应用要优化尽量避免或减少 Full GC 的原因。 JVM调优参数指定内存大小 jdk8 开始用 MetaSpace 区取代了 Perm 区永久代所以相应的 jvm 参数变成-XX:MetaspaceSize 及 -XX:MaxMetaspaceSize。 四、常见的GC
1、GC的演变过程内存不断扩大
常见组合SerialSerial Old【单线程】、PSPO【多线程】 、ParNewCMS
垃圾回收器使用的GC算法说明Serial标记-复制【Y】单线程、会发生STW。早期单核Serial Old“标记-整理”【O】单线程、STW。耗时长Parallel Scavenge标记-复制【Y】ParNew 的升级版本吞吐量优先的收集器吞吐量运行用户代码时间/(运行用户代码时间垃圾收集时间)区别在于提供了两个参数-XX:MaxGCPauseMillis 最大垃圾回收停顿时间-XX:GCTimeRatio 垃圾回收时间与总时间占比Parallel Old“标记-整理”【O】Serial Old的多线程版本STWParNew标记-复制【Y】Serial 的多线程版本会 STW多核机器CMS标记清理三色标记【O】并发多线程STW有所缩短。最大问题是会产生漏标G1标记-整理不分代。并发多线程解决了CMS的缺陷ZGC不分代。目前最好用的GC。Epsilon不执行任何垃圾回收工作。一旦java的堆被耗尽jvm就直接关闭。特殊场景1.开发JVM的人debug使用2.程序运行完都用不完内存等程序运行完直接清理所有内存。shenandoah开源成熟度也比较高。 换时间 三色标记算法黑色、灰色、白色 CMSConcurrent Mark Sweep 1Inital Mark 初始标记主要是标记 GC Root 开始的下级注仅下一级对象这个过程会 STW但是跟 GC Root 直接关联的下级对象不会很多因此这个过程其实很快。 2Concurrent Mark 并发标记根据上一步的结果继续向下标识所有关联的对象直到这条链上的最尽头。这个过程是多线程的虽然耗时理论上会比较长但是其它工作线程并不会阻塞没有 STW。 3Remark 再标志这是修正过程。为啥还要再标记一次因为第 2 步并没有阻塞其它工作线程其它线程在标识过程中很有可能会产生新的垃圾。 4Concurrent Sweep并行清理这里使用多线程以“Mark Sweep-标记清理”算法把垃圾清掉其它工作线程仍然能继续支行不会造成卡顿。 5、G1Garbage-First
G1最大的特点是引入分区的思路弱化了分代的概念。物理不分代、逻辑分代。G1也不需要跟别的收集器一起配合使用自己就可以搞定所有内存区域。 毛病一次回收要把年轻代全回收完。 6、ZGC
分页算法完全不分代了而且分区非常灵活。LoadBarrier读屏障。把比较满的分区做回收 G1算法通过只回收部分Region避免了全堆扫描改善了大堆下的停顿时间 7、Shenandoah
ColoredPointers LoadBarrier颜色指针算法读屏障 程序中最难调试的bug
野指针不再指向任何对象的指针同一个对象有两个指针一个释放了另一个不知道还在使用NPE并发问题多线程访问同一块内存空间