zoukankan      html  css  js  c++  java
  • 垃圾回收器种类

    在这篇教程中我们将学习几种现有的垃圾回收器。在Java中,垃圾回收是一个自动的进程可以替代程序员进行内存的分配与回收这些复杂的工作。这篇是垃圾回 收教程系列的第三篇,在前面的第2部分我们看到了在Java中垃圾回收是如何工作的,那是篇有意思的文章,我推荐你去看一下。第一部分介绍了Java的垃 圾回收,主要有JVM体系结构,堆内存模型和一些Java术语。

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

    1. 串行垃圾回收器(Serial Garbage Collector)
    2. 并行垃圾回收器(Parallel Garbage Collector)
    3. 并发标记扫描垃圾回收器(CMS Garbage Collector)
    4. G1垃圾回收器(G1 Garbage Collector)

    每种类型都有自己的优势与劣势。重要的是,我们编程的时候可以通过JVM选择垃圾回收器类型。我们通过向JVM传递参数进行选择。每种类型在很大程度上有 所不同并且可以为我们提供完全不同的应用程序性能。理解每种类型的垃圾回收器并且根据应用程序选择进行正确的选择是非常重要的。

    1、串行垃圾回收器

    串行垃圾回收器通过持有应用程序所有的线程进行工作。它为单线程环境设计,只使用一个单独的线程进行垃圾回收,通过冻结所有应用程序线程进行工作,所以可能不适合服务器环境。它最适合的是简单的命令行程序。

    通过JVM参数-XX:+UseSerialGC可以使用串行垃圾回收器。

    2、并行垃圾回收器

    并行垃圾回收器也叫做 throughput collector 。它是JVM的默认垃圾回收器。与串行垃圾回收器不同,它使用多线程进行垃圾回收。相似的是,它也会冻结所有的应用程序线程当执行垃圾回收的时候

    3、并发标记扫描垃圾回收器

    并发标记垃圾回收使用多线程扫描堆内存,标记需要清理的实例并且清理被标记过的实例。并发标记垃圾回收器只会在下面两种情况持有应用程序所有线程。

    1. 当标记的引用对象在tenured区域;
    2. 在进行垃圾回收的时候,堆内存的数据被并发的改变。

    相比并行垃圾回收器,并发标记扫描垃圾回收器使用更多的CPU来确保程序的吞吐量。如果我们可以为了更好的程序性能分配更多的CPU,那么并发标记上扫描垃圾回收器是更好的选择相比并发垃圾回收器。

    通过JVM参数 XX:+USeParNewGC 打开并发标记扫描垃圾回收器。

    4、G1垃圾回收器

    G1垃圾回收器适用于堆内存很大的情况,他将堆内存分割成不同的区域,并且并发的对其进行垃圾回收。G1也可以在回收内存之后对剩余的堆内存空间进行压缩。并发扫描标记垃圾回收器在STW情况下压缩内存。G1垃圾回收会优先选择第一块垃圾最多的区域

    通过JVM参数 –XX:+UseG1GC 使用G1垃圾回收器

    Java 8 的新特性

    在使用G1垃圾回收器的时候,通过 JVM参数 -XX:+UseStringDeduplication 。 我们可以通过删除重复的字符串,只保留一个char[]来优化堆内存。这个选择在Java 8 u 20被引入。

    我们给出了全部的四种Java垃圾回收器,需要根据应用场景,硬件性能和吞吐量需求来决定使用哪一种。

    垃圾回收的JVM配置

    下面的JVM关键配置都与Java垃圾回收有关。

    运行的垃圾回收器类型

    配置

    描述

    -XX:+UseSerialGC

    串行垃圾回收器

    -XX:+UseParallelGC

    并行垃圾回收器

    -XX:+UseConcMarkSweepGC

    并发标记扫描垃圾回收器

    -XX:ParallelCMSThreads=

    并发标记扫描垃圾回收器 =为使用的线程数量

    -XX:+UseG1GC

    G1垃圾回收器

    GC的优化配置

    配置

    描述

    -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垃圾回收教程的下一部分,我们将会用一个Java程序演示如何监视和分析垃圾回收

  • 相关阅读:
    [nodejs] web后端开发时, 用hapi/Joi对前端提交的数据进行校验--随笔
    [C++]类的空指针调用成员函数后,会发生什么事?
    赵家庙保险队大队长【永远置顶】
    NX二次开发-NXOpen C# OpenFileDialog弹出选择文件对话框
    NX二次开发-NXOpen C# string转tag
    NX二次开发-UFUN创建扫掠UF_MODL_create_sweep
    NX二次开发-NXOPEN C# WinForm点构造器UF.Ui.PointConstruct和UI加锁解锁UF.Ui.LockUgAccess
    vue 移动端手写手机验证码登录
    java--Scanner扫描器
    react中this.props.history实现跳转页面的使用方法
  • 原文地址:https://www.cnblogs.com/WPF0414/p/9807514.html
Copyright © 2011-2022 走看看