【学习提高】JVM垃圾收集器,垃圾回收算法,一个对象从创建到回收的过程。

1、JVM垃圾收集器

不同的垃圾回收器,适用于不同的场景。常用的垃圾回收器:
串行(Serial)回收器是单线程的一个回收器,简单、易实现、效率高。
并行(ParNew)回收器是Serial的多线程版,可以充分的利用CPU资源,减少回收的时间。
吞吐量优先(Parallel Scavenge)回收器,侧重于吞吐量的控制。
并发标记清除(CMS,Concurrent Mark Sweep)回收器是一种以获取最短回收停顿时间为目标的回收器,该回收器是基于“标记-清除”算法实现的。使用-XX:+UseConcMarkSweepGC打开
JDK8默认垃圾收集器(PS+PO);
G1垃圾收集器更多是在多处理器(或多核)以及大内存的机器上发挥优势,在满足指定GC停顿时间要求的同时,还具备高吞吐量的能力。JDK 9以后的默认垃圾收集器,取代了CMS 回收器。

2、垃圾回收算法

  1.标记–清除算法

标记:遍历内存区域,对需要回收的对象打上标记。
清除:再次遍历内存,对已经标记过的内存进行回收。
缺点:
效率问题:遍历了两次内存空间(第一次标记,第二次清除)。
空间问题:容易产生大量内存碎片,当再需要一块比较大的内存时,无法找到一块满足要求的,因而不得不再次出发GC。

  2.复制算法

将内存划分为等大的两块,每次只使用其中的一块。当一块用完了,触发GC时,将该块中存活的对象复制到另一块区域,然后一次性清理掉这块没有用的内存。下次触发GC时将那块中存活的的又复制到这块,然后抹掉那块,循环往复。优点
相对于标记–清理算法解决了内存的碎片化问题。效率更高(清理内存时,记住首尾地址,一次性抹掉)。
缺点:内存利用率不高,每次只能使用一半内存。

  3. 标记–整理算法

因为前面的复制算法当对象的存活率比较高时,这样一直复制过来,复制过去,没啥意义,且浪费时间。所以针对老年代提出了“标记整理”算法。
标记:对需要回收的进行标记
整理:让存活的对象,向内存的一端移动,然后直接清理掉没有用的内存。

  4. 分代收集算法

当前大多商用虚拟机都采用这种分代收集算法,这个算法并没有新的内容,只是根据对象的存活的时间的长短,将内存分为了新生代和老年代,这样就可以针对不同的区域,采取对应的算法。如:
新生代,每次都有大量对象死亡,有老年代作为内存担保,采取复制算法。
老年代,对象存活时间长,采用标记整理,或者标记清理算法都可。

3、一个对象从创建到回收的过程

【学习提高】JVM垃圾收集器,垃圾回收算法,一个对象从创建到回收的过程。_第1张图片
  绝大部分对象在 Eden 区生成,当 Eden 区装填满的时候,会触发 Young Garbage Collection,即 YGC。
垃圾回收的时候,在 Eden 区实现清除策略,没有被引用的对象则直接回收。依然存活的对象会被移送到 Survivor 区。Survivor 区分为 S0 (from)和 S1(to) 两块内存空间。每次 YGC 的时候,它们将存活的对象复制到未使用的那块空间,然后将当前正在使用的空间完全清除,交换两块空间的使用状态。如果 YGC 要移送的对象大于 Survivor 区容量的上限,则直接移交给老年代。
一个对象也不可能永远呆在新生代,就像人到了 18 岁就会成年一样,在 JVM 中 -XX:MaxTenuringThreshold 参数就是来配置一个对象从新生代晋升到老年代的阈值。
默认值是 15,可以在 Survivor 区交换 14 次之后,晋升至老年代。

生产稳定:JVM-MySQL-Tomcat-服务调用,调优相关
生产稳定:JVM调优- java进程,JVM频繁GC,导致CPU占用、内存占用过高过高定位和排查
学习提高:Idea 使用docker 部署SpringBoot应用并指定JVM参数,jdk8版本

-------------如果对你有用,请给个赞,谢谢~~
-------------欢迎各位留言交流,如有不正确的地方,请予以指正。【Q:981233589】

你可能感兴趣的:(Java常见面试题,JavaCore,虚拟机,jvm,算法,学习)