当前位置: 首页 > 科技观察

Java的七个垃圾收集器_0

时间:2023-03-16 00:08:21 科技观察

了解Java中的内存管理。当使用C或C++等编程语言编写应用程序时,您需要编写代码来销毁内存中不再需要的对象。随着应用程序变得越来越复杂,未使用的对象越有可能被忽略而被释放。这会导致内存泄漏,最终您会耗尽内存,并且在某个时候将没有更多的内存可以分配。结果是应用程序因OutOfMemoryError而失败。但在Java中,垃圾收集器GarbageCollection(GC)在程序执行期间自动运行,减轻了手动分配内存和可能出现的内存泄漏的任务。不仅有一个垃圾收集器,Java虚拟机(JVM)有七种不同的垃圾收集器,了解每种垃圾收集器的用途和好处很有用。1.串行收集器串行线程垃圾收集垃圾收集器的原始实现使用单线程。当垃圾收集器运行时,它会停止应用程序(通常称为“停止世界”事件)。适用于可以容忍短暂暂停的应用程序。这种垃圾收集器的内存占用相对较小,因此这是嵌入式应用程序首选的垃圾收集器类型。使用以下命令在运行时启用垃圾收集器:$java-XX:+UseSerialGC2,Parallelcollector并行垃圾收集与Serial收集器一样,Parallel收集器也使用“stoptheworld”方法。这意味着应用程序线程在垃圾收集器运行时停止。但不同的是,Parallel收集器运行时,有多个线程在执行垃圾收集操作。这种类型的垃圾收集器适用于在多线程和多处理器环境中运行的具有大中型数据集的应用程序。这是JVM中的默认垃圾收集器,也称为吞吐量收集器。可以使用各种适当的JVM参数(例如吞吐量、暂停时间、线程数和内存占用)来调整垃圾收集器。如下:线程数:-XX:ParallelGCThreads=暂停时间:-XX:MaxGCPauseMillis=吞吐量(花在垃圾回收上的时间与应用程序实际执行时间的比值):-XX:GCTimeRatio=Maximum堆内存:-Xmx可以使用以下命令显式启用并行收集器:java-XX:+UseParallelGC。使用该命令指定垃圾回收在新生代中由多个线程执行,而老年代中的垃圾回收和内存压缩仍然使用单线程完成。还有一种称为“ParallelOldGC”的并行收集器版本,它对新生代和老年代都使用多线程。启用命令如下:$java-XX:+UseParallelOldGC3,ConcurrentMarkSweep(CMS)collectorConcurrentgarbageConcurrentMarkSweep(CMS)垃圾收集器与应用程序并行运行。多线程用于年轻代和老年代。CMS垃圾收集器移除未使用的对象后,不会对存活的对象执行内存压缩。垃圾收集器与应用程序并行运行,减少了应用程序的响应时间,适用于暂停时间短的应用程序。这个收集器在Java8中被弃用并在Java14中被移除。如果您仍在使用具有此垃圾收集器的Java版本,则可以使用以下命令启用它:$java-XX:+UseConcMarkSweepGC在使用CMS垃圾收集器期间,应用程序将暂停两次。第一次暂停发生在标记可直接访问的活动对象时,这种暂停称为初始标记。第二次暂停发生在CMS收集器结束时,以修复在并发标记期间CMS垃圾收集完成后更新对象时应用程序线程遗漏的对象。这称为重新标记。4.G1垃圾收集器GarbagefirstG1垃圾收集器旨在取代GMS。G1垃圾收集器具有并行、并发和增量压缩的特点,暂停时间短。与CMS收集器使用的内存布局不同,G1收集器将堆内存划分为大小相等的区域,通过多个线程触发全局标记阶段。标记阶段完成后,G1知道哪个区域可能大部分是空的,并且更喜欢该区域进行清除/删除阶段。在G1收集器中,如果对象的大小超过区域容量的一半,则该对象被认为是“大对象”。这些对象被放置在老年代,在一个叫做“humongousregion”的区域。启用G1收集器的命令如下:$java-XX:+UseG1GC5,Epsiloncollector这个垃圾收集器是Java11引入的,是一个no-op(无操作)收集器。它不做任何实际的内存回收,它只负责管理内存分配。只有当您知道应用程序的确切内存占用并且不需要垃圾收集时,才应使用Epsilon。启用命令如下:$java-XX:+UnlockExperimentalVMOptions-XX:+UseEpsilonGC6,Shenandoah收集器Shenandoah是JDK12引入的,是一个CPU密集型垃圾收集器。它执行内存压缩,立即删除无用的对象并释放操作系统中的空间。所有这些都与应用程序线程并行发生。启用命令如下:$java-XX:+UnlockExperimentalVMOptions-XX:+UseShenandoahGC7,ZGC收集器ZGC是为低延迟需求和大堆空间使用而设计的,允许Java应用程序在垃圾收集器运行时继续运行。ZGC收集器在JDK11中引入,并在JDK12中得到改进。在JDK15中,ZGC和Shenandoah都被移除了实验阶段。使用以下命令启用ZGC收集器:$java-XX:+UnlockExperimentalVMOptions-XX:+UseZGC灵活的垃圾收集器Java为我们提供了灵活的内存管理方式,熟悉不同的可用方式有助于开发或运行应用程序的选择最合适的内存管理方法。