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

yizhihongxing

下面是关于如何做 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日

相关文章

  • SpringBoot 整合Security权限控制的初步配置

    下面是 “SpringBoot 整合Security权限控制的初步配置”的完整攻略,包含了基础概念、示例程序与注意事项。 1. 简介 Spring Security 是一个安全框架,提供了认证、授权、攻击防护等一系列的安全功能,是目前比较流行的开源 Java 安全框架之一。 Spring Security 采用基于过滤器的方式实现安全控制,对 URL 进行拦…

    Java 2023年6月3日
    00
  • RestTemplate添加HTTPS证书全过程解析

    首先我们来介绍一下RestTemplate,它是Spring Framework的一个类,可以简化HTTP客户端的编程工作。通俗地说,它可以让我们轻松使用Java代码发送HTTP请求,接收响应等操作。但是如果要使用HTTPS协议,则需要添加证书。下面就为大家详细介绍一下添加HTTPS证书的全过程。 第一步:获取证书文件 首先,我们需要获取HTTPS证书的文件…

    Java 2023年5月19日
    00
  • 详解Java中格式化日期的DateFormat与SimpleDateFormat类

    详解Java中格式化日期的DateFormat与SimpleDateFormat类 在Java编程中,时间和日期的操作是比较常见的,因此学习Java中时间和日期的处理是很有必要的。在Java中,可以使用 DateFormat 和 SimpleDateFormat 类来对日期进行格式化。 DateFormat类 DateFormat 类是抽象类,提供了与日期相…

    Java 2023年5月20日
    00
  • 了解JAVA Future类

    了解JAVA Future类的完整攻略 概述 Future类是Java里面可用于异步计算的一种设计模式。该模式依赖于将异步操作提交到执行者(Executor)。简单来说,Future是一个接口,定义了获取异步计算结果的一种方式,不必等待计算完成。 它在Java的java.util.concurrent包中被定义,用于描述异步计算的结果。在执行异步计算时,可以…

    Java 2023年5月26日
    00
  • java中的JsonSerializer用法,前后端单位转换必备

    下面我将详细讲解 Java 中的 JsonSerializer 的用法以及前后端单位转换的必备操作,内容如下: 1. 什么是 JsonSerializer JsonSerializer 是 Jackson 库中的一个类,主要是用于将 Java 对象序列化成 JSON 格式的字符串。在前后端交互时,常用的数据格式就是 JSON,因此在开发网站时,为了在前后端间…

    Java 2023年5月26日
    00
  • SpringMVC拦截器快速掌握下篇

    以下是关于“SpringMVC拦截器快速掌握下篇”的完整攻略,其中包含两个示例。 SpringMVC拦截器快速掌握下篇 在SpringMVC中,拦截器可以用于在请求到达控制器之前或之后执行一些操作。本文将介绍如何在SpringMVC中使用拦截器,并提供两个示例。 编写拦截器 要编写一个拦截器,我们需要实现HandlerInterceptor接口。以下是一个示…

    Java 2023年5月16日
    00
  • Java利用多线程模拟银行系统存钱问题

    Java利用多线程模拟银行系统存钱问题的完整攻略 1. 问题分析 假设有两个用户账户,分别在同一时间存钱,我们需要通过Java多线程模拟存钱的过程并确保数据的准确性和安全性。 2. 解决方案 为了确保数据的安全,Java使用了synchronized关键字来实现线程同步,同时也使用了wait()和notify()方法来解决线程的等待和调度问题。 Java中可…

    Java 2023年5月18日
    00
  • Spring的注解简单介绍

    下面是Spring的注解简单介绍攻略。 一、概述 Spring是一个轻量级的开源Java框架,它可以用来构建企业级应用程序。在Spring框架中,注解是一种非常方便的方式,它可以用来代替一部分繁琐的XML配置工作。通过注解,我们可以更加方便地描述应用程序的组成部分,并且更加简洁明了,提高代码可读性。 二、注解简介 在Spring中,常用的注解包括: 1. @…

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