众所周知,垃圾收集是影响性能的事情之一,所以我们应该努力学习GC的基本知识,特别是因为Java 8在这一领域做了一些重大的更改和改进,尤其是随着PermGen的删除和一些新的令人兴奋的优化。通过参加java培训,学习最新java技能,可以让你的实力一直保持领先水平,提升行业竞争力。
当我们谈论垃圾收集时,绝大多数人都知道这个概念,并在日常编程中使用它。即便如此,我们还是有很多不理解的地方。关于JVM最大的误解之一是它有一个垃圾收集器,实际上它提供了四个不同的垃圾收集器,每个垃圾收集器都有自己独特的优点和缺点。选择使用哪一个是由你自己决定的,吞吐量和应用程序暂停之间的差异可能是巨大的。
这四种垃圾收集算法的共同点是,它们是分代的,这意味着它们将托管堆划分为不同的部分,使用了一种古老的假设,即堆中的大多数对象都是短暂的,应该快速回收。
1.串行收集器
串行收集器是最简单的,也是你可能不会使用的,因为它主要是为单线程环境(例如32位或Windows)和小堆设计的。这个收集器在工作时会冻结所有应用程序线程,这使得它在任何情况下都不能在服务器环境中使用。在java培训中,有很多关于Java开发工具、库和框架的培训课程,在专业老师的教学指导下,可以很全面地掌握相关知识和技能。
如何使用它:你可以通过打开-XX:+UseSerialGCJVM参数来使用它
2.并行/吞吐量收集器
接下来是并行收集器。这是JVM的默认收集器。就像它的名字一样,它最大的优点是使用多个线程来扫描和压缩堆。并行收集器的缺点是,当执行次要或完整GC收集时,它将停止应用程序线程。并行收集器最适合那些可以容忍应用程序暂停并试图优化收集器导致的较低CPU开销的应用程序。
3.CMS收集器
并行收集器的后续是CMS收集器(“并发标记扫描”)。该算法使用多个线程(“并发”)在堆中扫描(“标记”)可回收的未使用对象(“扫描”)。在两种情况下,该算法将进入“停止世界”(STW)模式:当初始化根(旧一代中可以从线程入口点或静态变量访问的对象)的初始标记时,以及当应用程序在算法同时运行时更改了堆的状态时,迫使它返回并做一些最后的润色,以确保它标记了正确的对象。对Java感兴趣的同学可以参加java培训,可以获得快速有效的学习。
使用此收集器时,最大的问题是遇到升级失败,即在收集年轻一代和老年一代之间发生竞争的情况。如果收集器需要将年轻的对象提升到旧一代,但没有足够的时间腾出空间来清除它,它将不得不首先这样做,这将导致完整的STW收集——这正是CMS收集器想要防止的事情。为了确保这种情况不会发生,你可以增加旧一代的大小(或者整个堆的大小),或者为收集器分配更多的后台线程,让他与对象分配的速率竞争。
与并行收集器相比,该算法的另一个缺点是,它使用更多的CPU,通过使用多个线程执行扫描和收集,为应用程序提供更高级别的连续吞吐量。对于大多数不利于应用程序冻结的长期运行的服务器应用程序,这通常是一个很好的权衡。即便如此,该算法在默认情况下也不会启用。你必须指定XX:+USeParNewGC才能真正启用它。如果你愿意分配更多的CPU资源来避免应用程序暂停,假设你的堆大小小于4Gb,这就是你可能想要使用的收集器。然而,如果它大于4GB,你可能会想使用最后一种算法——G1收集器。想学习java技术的同学,不妨报个Java培训班,有明确清晰的学习路线,理论知识+实战操作,可以获得快速提升。
4.G1收集器
JDK7更新4中引入的垃圾优先收集器(G1)旨在更好地支持大于4GB的堆。G1收集器利用多个后台线程来扫描它划分为区域的堆,范围从1MB到32MB(取决于堆的大小)。G1收集器旨在首先扫描那些包含最多垃圾对象的区域,并将其命名为(垃圾优先)。此收集器是使用–XX:+UseG1GC标志打开的。
此策略降低了在后台线程完成对未使用对象的扫描之前堆被耗尽的可能性,在这种情况下,收集器将不得不停止应用程序,这将导致STW收集。G1还有另一个优点,那就是它在移动中压缩了堆,而CMS收集器只在完整的STW收集过程中才这样做。在java培训中,不仅有理论知识的课程,还有大量实战项目学习,让你在实践中真正掌握Java知识和技能。
在过去的几年里,大型堆一直是一个相当有争议的领域,许多开发人员从每台机器的单个JVM模型转向每台机器有多个JVM的更微服务、组件化的架构。这是由许多因素驱动的,包括希望隔离不同的应用程序部分,简化部署,避免将应用程序类重新加载到内存中通常会带来的成本(这在Java 8中实际上得到了改进)。
即便如此,在JVM中,这样做的最大驱动因素之一源于避免大型堆中出现的长时间“停止世界”暂停(在大型集合中可能需要几秒钟)的愿望。Docker等容器技术也加速了这一进程,使你能够相对轻松地在同一物理机器上部署多个应用程序。
总结
这些收集器中的每一个都通过一系列切换和开关进行了不同的配置和调整,每个都有可能增加或减少吞吐量,所有这些都基于你的应用程序的特定行为。参加java培训是入门学习的最佳选择,有经验丰富的专业老师面授指导教学,通过理论结合实战的方式教授java基础知识,帮助你更好的理解与运用java。