• [译]Java垃圾回收器的类型


    说明:这篇文章来翻译来自于JavapapersTypes of Java Garbage Collectors

    在这部分的教程中我们将讲到可使用的四种不同类型的Java垃圾回收器。垃圾回收是Java中的一个自动操作的进程,它负责处理程序中对象内存的分配和回收。本篇文章是系列教程的第三部分,在前面的第二部分中我们谈到了在Java中垃圾回收是如何工作的,我建议你去好好的读下因为它读起来很有意思。在第一部分的Java垃圾回收的介绍中,我们谈到了JVM架构、堆内存模型以及相关的Java名词。

    Java有四种类型的垃圾回收器

    • 1.串行垃圾回收器
    • 2.并行垃圾回收器
    • 3.CMS垃圾回收器
    • 4.G1垃圾回收器

    Types-of-Java-Garbage-Collectors3_th_thumb

    这四种类型中的每一个都有他们自己的优势和劣势。最重要的是,我们程序员可以选择JVM使用的垃圾回收器的类型。我们选择类型通过将可选的参数传递给JVM。每一种垃圾回收器都有很大的不同而且对于不同的应用程序可以提供完全不同的表现。所以理解每一种类型的垃圾回收器并且根据应用程序来合适的使用很有意义的。

    1.串行垃圾回收器##

    串行垃圾回收器在工作的时候会持有所有的应用程序线程。它本设计用在单线程环境中。在垃圾回收的时候它只有一个线程在使用。它在进行垃圾回收的时候会将其他的应用程序线程给冻结住,所以它不太适合用于一个服务器环境。它最适合用于单命令行程序。

    开启-XX:+UseSerialGCJVM参数就可以使用串行垃圾回收器了。

    2.并行的垃圾回收器##

    并行垃圾回收器也被称为吞吐量优先收集器。它是JVM中默认的垃圾回收器,它使用多个线程用于垃圾回收。和串行垃圾回收器类似的是当它在进行垃圾回收操作的时候也会将其他的应用程序线程给冻结住。

    3.CMS垃圾回收器##

    并发标记清理(CMS)垃圾回收器使用多个线程去扫描堆内存并且标记回收的实例然后清理被标记的实例。CMS垃圾回收器在下面的两种场景下会持有所有的应用程序线程:

    • 1.在标记在老年代中被引用的对象的时候
    • 2.在进行垃圾回收时如果在堆内存中在并行出现了改变

    和并行垃圾回收器相比,CMS收集器使用更多的CPU去确保更好的应用程序吞吐量。如果为了一更好的表现我们能够分配跟多的CUP给它,那么CMS相对于并行回收器是一个更好的选择。

    开启XX:+USeParNewGCJVM参数就可以使用CMS垃圾回收器了。

    4.G1垃圾回收器##

    G1垃圾回收器用于大型的堆内存区。它将堆内存进行分区然后并行进行回收操作。G1在释放内存之后仍然进行空闲对空间的压缩操作。但是CMS进行压缩内存操作是在程序停下来以后。G1是根据最大的垃圾而优先次序来进行分区。

    开启–XX:+UseG1GCJVM参数就可以使用G1垃圾回收器了。

    Java8改进##

    在使用G1垃圾回收器的使用开启JVM参数-XX:+UseStringDeduplication。这样的操作可以在移除多个字符串值的时候转换成单个字符数组。这个可选项是在Java 8 u 20

    考虑到上面四中不同类型的垃圾回收器,具体使用哪一个取决于应用程序的场景、可用的硬件以及要求的吞吐量。

    垃圾回收JVM选项

    下面是一些和Java垃圾回收相关的重要的JVM选项。

    开启垃圾回收器的选项

    OptionDescription
    -XX:+UseSerialGC Serial Garbage Collector
    -XX:+UseParallelGC并行垃圾回收器
    -XX:+UseConcMarkSweepGCCRM垃圾回收器
    -XX:ParallelCMSThreads=CMS回收器– 线程的使用数目
    -XX:+UseG1GCG1 垃圾回收器

    GC优化选项

    OptionDescription
    -Xms初始化堆内存大小
    -Xmx最大的堆内存大小
    -Xmn年轻代大小
    XX:PermSize初始化永久代大小
    -XX:MaxPermSize最大的永久代大小

    JVM GC选项的使用示例

    java -Xmx12m -Xms3m -Xmn1m -XX:PermSize=20m -XX:MaxPermSize=20m -XX:+UseSerialGC -jar java-application.jar
    

    在下一篇系列文章中我们将用Java程序的例子来看如何监控和分析垃圾回收。

  • 相关阅读:
    【Blog怎么玩】如何修改博客地址栏logo—怎样查找和制作ico文件
    【Blog怎么玩】怎么给博客添加支付宝/微信打赏按钮—tctip打赏插件开源
    【免费开源网站】利用乐云xzc.cn结合百度网盘来收作业
    【数字信号处理不挂科-笔记】第三讲-离散傅立叶变换
    【数字信号处理不挂科-笔记】第一讲-离散时间信号与系统
    【Blog怎么玩】学长教你怎么在博客里播放音乐+krc转lrc(krc2lrc)
    【南工程开源计划-通信网】南工程通信09级A卷-通信网
    【南工程开源计划-通信网】南工程通信07级A卷-通信网
    【南工程开源计划-通信网】南工程通卓15级B卷-电力系统通信网期末考试
    【南工程开源计划-通信网】南工程通卓17级A卷-通信网期末考试
  • 原文地址:https://www.cnblogs.com/zhangminghui/p/4128623.html
Copyright © 2020-2023  润新知