面试官:怎么做JDK8的垃圾收集器的调优(面试常问)

下面是关于如何做 JDK8 的垃圾收集器调优的完整攻略:

前言

Java 作为一门高级语言,在垃圾回收上具有很大优势,JDK8 中垃圾收集器不仅越来越多,同时也变得越来越复杂。垃圾收集器调优无疑成为优化 Java 性能的关键),以下将详细介绍如何做JDK8的垃圾收集器调优。

收集器种类

JDK8 中常用的垃圾收集器有以下几种:

  • Serial 收集器:适用于单处理器机器和小型应用;
  • Parallel 收集器:适用于多CPU或多核心服务环境;
  • CMS 收集器:适用于大内存服务环境;
  • G1 收集器:JDK7 中引入的,适用于大内存服务环境,可以取代 CMS。

接下来,将会针对不同的场景,分别介绍垃圾收集器的调优方法。

单CPU场景

在单 CPU 的场景下,我们需要采用 Serial 收集器。优化方法如下:

  1. 启用动态分配年轻代大小,使其逐渐变大
    -XX:NewRatio=年老代/年轻代大小

例如:1 表示年轻代占整个 Java 堆大小的 1/2, 3 表示年轻代占整个 Java 堆大小的 1/4。

  1. 初始堆大小不要太大,减少相关的方法区的内存占用,可以使用下列参数:

-Xms64m -Xmx64m -XX:PermSize=32M -XX:MaxPermSize=32M

以上参数可以设置堆内存为 64MB,方法区内存为 32MB。

多CPU场景

在多 CPU 的场景下,我们需要采用 Parallel 收集器。在调优过程中,我们需要根据应用场景和硬件环境进行调整,以下是建议值:

  1. 根据应用类型和机器数量确定并行收集器的线程数:

-XX:ParallelGCThreads:设置并发垃圾回收的线程数,建议设置为 CPU 数量。

  1. 配置堆大小:

-Xms1G -Xmx1G:设置堆大小为 1G。

  1. 根据应用内存占用情况确定年轻代和幸存者代的大小:

-XX:SurvivorRatio:设置幸存者代占比,如 8 表示幸存者代占年轻代的 1/8。

大内存场景

在大内存场景下,我们需要采用 CMS 或 G1 收集器。

CMS 收集器调优

CMS 收集器在 Java 6 和 7 中可以承载大量的内存,但随着 Java 8 的发布,在大内存场景下,G1 收集器逐渐替代了 CMS 收集器。

  1. 可以通过下面的参数来启用 CMS 收集器:

-XX:+UseConcMarkSweepGC

  1. 配置相关参数,使其更高拥有更好的性能:

-Xms5g -Xmx5g -XX:PermSize=256M -XX:MaxPermSize=256M -XX:CMSInitiatingOccupancyFraction=70 -XX:+UseCMSInitiatingOccupancyOnly

以上参数可以设置堆内存为 5GB,方法区内存为 256MB,并行收集阈值为 70。

G1 收集器调优

G1 的特点是,在大内存场景下,更适合使用,G1 和 CMS 相比,最大的不同是标记压缩的算法和并发收集范围的技术。设置 G1 收集器的参数如下:

-XX:+UseG1GC
-XX:G1HeapRegionSize=32m
-XX:G1ReservePercent=20
-XX:InitiatingHeapOccupancyPercent=75
  1. -XX:+UseG1GC 表示启用 G1 收集器。

  2. -XX:G1HeapRegionSize 表示 G1 时生成的区域大小,默认为 1MB,建议为 32MB-256MB,具体大小需要测试以获得最佳性能。

  3. -XX:G1ReservePercent 表示预定义一些堆内存,作为备选内存,避免在并发收集中添加前口号失败。默认为 10,建议设置为 20。

  4. -XX:InitiatingHeapOccupancyPercent:设置触发并发收集的堆占用率,默认为 45,建议设置为 75。

至此,JDK8 垃圾收集器的调优攻略就介绍完了。在实际应用中, 我们可以根据应用场景和硬件环境进行调整,找到最佳的垃圾收集器来优化应用程序的性能。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:面试官:怎么做JDK8的垃圾收集器的调优(面试常问) - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • 关于Lombok简化编码使用及说明

    关于Lombok简化编码使用及说明 简介 Lombok是一种可以帮助Java程序员通过使用注解来消除Java Bean类中的大量样板代码的工具,例如getters、setters和构造函数等。Lombok还提供了一些有用的注解,如@Data和@Builder,使Java开发更加便捷和简洁。 安装 在Maven项目中使用Lombok只需要在pom.xml中添加…

    Java 2023年5月20日
    00
  • Java 输入输出 IO NIO AIO三兄弟对比分析对比分析

    Java 输入输出(IO)、新输入输出(NIO)、异步输入输出(AIO)三兄弟对比分析 在Java中,I/O需要通过读或写来完成,每一种不同的I/O方式都有其适用场景和优缺点。Java中主要有三个I/O机制,分别是传统的I/O、NIO和AIO。本文将对这三种I/O方式进行详细比较,包括它们各自的特点和使用场景。 传统的I/O 传统I/O是指在Java中使用I…

    Java 2023年5月26日
    00
  • 在js与java中判断json数据中是否含有某字段的案例

    在 JS 中判断 JSON 数据中是否含有某字段的方法如下: 使用 in 运算符: const jsonData = { name: ‘Tom’, age: 18 }; if (‘name’ in jsonData) { console.log(‘jsonData 存在 name 字段’); } 使用 hasOwnProperty() 方法: const j…

    Java 2023年5月26日
    00
  • Java中equals()方法实例详解

    Java中equals()方法实例详解 在Java语言中,Object类中的equals()方法用来比较对象的内容是否相等。相较于Java中的”==”运算符来说,它比较的不是变量在内存中的地址,而是变量的内 容。因此,equals()方法在很多时候比”==”更加实用。 equals方法的详细用法 public boolean equals(Object ob…

    Java 2023年5月26日
    00
  • 详解Spring Boot 定时任务的实现方法

    Spring Boot提供了一种简单的方式来实现定时任务。以下是详解Spring Boot定时任务的实现方法的完整攻略: 添加依赖 在pom.xml文件中添加以下依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>sp…

    Java 2023年5月15日
    00
  • SpringBoot整合Hibernate Validator实现参数验证功能

    下面我将详细讲解“SpringBoot整合Hibernate Validator实现参数验证功能”的完整攻略,过程中将包含两条示例。 什么是Hibernate Validator Hibernate Validator是一款Java Bean验证框架,它提供了一套丰富的注解,使用这些注解可以很方便地实现对Java Bean字段的验证。在一些Web开发中,我们…

    Java 2023年5月20日
    00
  • Java 泛型详解(超详细的java泛型方法解析)

    Java泛型详解 什么是泛型? 泛型主要体现在类和方法中,用于实现在编译时期进行类型检查和类型推断的功能,从而避免了在运行时出现类型转换的错误。 泛型类 泛型类是指在类的定义中使用了泛型,即类中的属性、方法等都可以使用泛型。泛型类的语法格式如下: class ClassName<T1, T2, …> { //属性的类型也可以使用泛型 T1 a…

    Java 2023年5月23日
    00
  • 让IIS6支持JSP的设置方法(IIS完美整合Tomcat)

    让IIS6支持JSP的设置方法主要是通过IIS和Tomcat的联合来实现,在整合过程中,需要对IIS的默认配置进行一些修改与设置,以便让IIS能够支持JSP页面的访问。 以下是详细的设置步骤: 1. 安装Tomcat 首先需要安装支持JSP和Servlet的Tomcat服务器,可以去官网下载Tomcat,下载完成后进行安装,安装时需要指定Tomcat的安装路…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部