面试官:怎么做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日

相关文章

  • 深入了解MyBatis参数

    深入了解MyBatis参数 MyBatis是一款优秀的数据库持久化框架,在使用过程中主要涉及到参数的设置和传递。深入了解MyBatis参数对于提高MyBatis的性能和灵活性非常重要。 1. 参数的传递 MyBatis支持三种方式的参数传递: 1.1. 单个参数 单个参数是指只传递一个参数,使用最为简单。 Java代码 public interface Us…

    Java 2023年5月20日
    00
  • 深入理解spring boot异步调用方式@Async

    下面是关于“深入理解spring boot异步调用方式@Async”的完整攻略。 @Async注解的解释和作用 @Async注解是Spring Boot框架提供的一个异步调用方式,能够帮助我们更好的优化系统性能和提升用户体验。在Spring Boot框架的异步调用方式中,我们可以通过使用@Async注解来标记方法,从而实现异步调用。 在使用@Async注解时…

    Java 2023年5月26日
    00
  • Java获取文件的路径及常见问题解决方案

    关于Java获取文件的路径及常见问题解决方案,下面是详细的攻略。 1. Java获取文件的路径 在Java中获取文件的路径是非常常见的需求,可以使用以下几种方式来获取: 1.1 获取当前运行的Java程序所在路径 String path = System.getProperty("user.dir"); 使用System.getPrope…

    Java 2023年5月20日
    00
  • Java序列化常见实现方法代码实例

    Java序列化常见实现方法代码实例 Java序列化是将Java对象转化为字节流的过程,方便进行Java对象在网络中的传输或者持久化储存。本文将介绍Java序列化的常见实现方法以及代码实例。 Java序列化实现方法 Serializable接口 Java的原生序列化实现采用Serializable接口,它是Java提供的一个标记接口,将一个类实现Seriali…

    Java 2023年5月23日
    00
  • java生成图片验证码示例程序

    下面就为您介绍一下生成图片验证码的示例程序。 生成图片验证码示例程序 步骤1:导入验证码库 在Java中创建一个图片验证码需要用到非常多的API,用起来比较繁琐,因此我们可以使用一些第三方库来简化代码。这里我推荐使用Google的Guava库,该库提供了生成图片验证码的常用API,也可以方便的操作对象、字符串、集合等。 在Maven项目的pom.xml文件中…

    Java 2023年6月15日
    00
  • JAVA字符串反转的三种方法

    下面是“JAVA字符串反转的三种方法”的完整攻略: 方法一:使用StringBuilder或StringBuffer的reverse()方法 我们可以使用StringBuilder或StringBuffer类的reverse()方法来反转字符串。这两个类都提供了一种修改字符串的方法,可以在原字符串的基础上直接进行修改,从而减少了额外的内存消耗。 以下是使用S…

    Java 2023年5月27日
    00
  • Java基于jdbc连接mysql数据库操作示例

    下面是Java基于JDBC连接MySQL数据库操作的完整攻略,包含两条示例。 步骤一:准备工作 在开始Java程序连接MySQL数据库之前,需要完成以下几个准备工作: 安装MySQL数据库并创建需要操作的数据库和表 下载并安装Java JDK 下载并安装MySQL Connector/J驱动程序 步骤二:创建数据库连接 请按照以下步骤创建数据库连接: 加载M…

    Java 2023年5月19日
    00
  • java后端把数据转换为树,map递归生成json树,返回给前端(后台转换)

    首先,需要明确一下这个过程的流程和目的:将后端获得的数据转换为树形结构,再通过递归生成 JSON 树,并返回给前端。下面我们将详细讲解这个过程。 1. 将数据转换为树形结构 首先,需要将后端的数据进行转换,变成树形结构。可以使用递归来完成这个过程。 具体实现方式如下:首先,定义一个树节点的类 Node,包含节点名称、节点编号、父节点编号、节点类型等属性。然后…

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