用于高吞吐量和低延迟的 JVM 性能调优

    Java 虚拟机 (JVM) 调优是调整默认参数以满足我们的应用程序需求的过程。这包括通过选择合适的垃圾回收器来使用优化版本的 getter 来调整堆的大小等简单调整。

405dd21b2ed6993740fc772f955a4c63.png

了解 Java 虚拟机 (JVM)

    什么是 JVM?

Java 虚拟机 (JVM) 是 Java 生态系统中的一个关键组件,它使 Java 应用程序能够独立于平台。它解释 Java 字节码,并将其作为机器码在各种操作系统上执行,从而实现“一次编写,随处运行”的可能性。

优化垃圾回收

垃圾回收

    Java 应用程序会创建许多对象来处理传入请求。处理完这些请求后,对象将成为 “垃圾”,必须进行清理。垃圾回收 (GC) 对于释放内存至关重要,但会减慢响应时间并增加 CPU 使用率。因此,优化 GC 对于优化性能非常重要。

ZGC 算法

    Z Garbage Collector (ZGC) 的主要特点是它专注于最大限度地减少 GC 暂停时间。它旨在确保暂停时间(通常为几毫秒),即使堆大小较大。

    在需要低延迟性能、大堆或高吞吐量、低延迟使用案例的多线程或内存密集型应用程序中选择 ZGC。它可以最大限度地减少暂停时间,使用大内存大小进行扩展,并提高可预测性。

JVM 参数

    要在多线程或内存密集型服务中实现高吞吐量和低延迟,您必须调整 JVM 参数。

-XSS256K

  • Java 中的选项用于设置 Java 虚拟机 (JVM) 中每个线程的线程堆栈大小。该选项专门将线程堆栈大小设置为 256 KB。在优化 Java 应用程序时,尤其是在多线程方案中,此值非常有用。-Xss-Xss256k

  • 优点:在高度并发的应用程序中,例如处理许多并发请求的服务器(例如,Web 服务器、消息代理等),减小线程堆栈大小可以通过允许在不达到内存限制的情况下创建更多线程来帮助防止内存耗尽。

-Xms<尺寸>g

  • Java 中的 JVM 选项指定应用程序启动时 JVM 的初始堆大小。-Xms

  • 优点:大型 Web 应用程序、数据处理系统或内存中数据库可能会受益于初始大型堆分配以满足其内存需求,而无需在启动期间不断调整堆大小。

-Xmx<MaxSize>g

  • Java 中的 JVM 选项设置 JVM 的最大堆大小。最大大小可以是 RAM 的 90%。-Xmx

  • 优点:

    • 避免 OutOfMemoryError

    • 优化 GC 性能

    • 优化内存密集型应用程序(内存数据库、缓存等)

    • 避免频繁的堆大小调整

    • 提高多线程应用程序的性能

-XX:+使用 ZGC

  • Java 中的选项在 JVM 中启用 ZGC。ZGC 是一种低延迟垃圾回收器,旨在最大限度地减少垃圾回收期间的暂停时间,即使对于使用非常大的堆(高达 TB 的内存)运行的应用程序也是如此。-XX:+UseZGC

  • 优点:

    • 低延迟 GC

    • 大型堆的可扩展性

    • 并发和增量 GC

    • 适用于容器化和云原生环境

    • 暂停时间短,即使在完整 GC 期间也是如此

    • 更适合多核系统

-XX:+ZGenerational

  • 该选项在 Java 中用于为 ZGC 启用分代模式。默认情况下,ZGC 作为非分代垃圾回收器运行,这意味着它在执行垃圾回收时将整个堆视为单个统一的区域。-XX:+ZGenerational

  • 优点:

    • 提高具有许多短期对象的应用程序的性能

    • 通过单独收集新生代来减少 GC 暂停时间

    • 改进了堆管理

    • 降低完整 GC 的成本

    Using 在 ZGC 中启用分代垃圾回收,通过将短期和长期对象隔离到堆的不同区域,从而提高这些应用程序的性能。这可以带来更好的内存管理、减少暂停时间并提高可扩展性,特别是对于处理大量数据的大规模应用程序。-XX:+ZGenerational

-XX:SoftMaxHeapSize=<大小>g

  • JVM 选项用于为 Java 应用程序设置最大堆大小的软限制。当您使用 时,您是在告诉 JVM 在正常情况下将堆大小设置为不超过 4 GB (GB),但如有必要,允许 JVM 超过此限制。-XX:SoftMaxHeapSize-XX:SoftMaxHeapSize=4g

  • 优点:

    • 灵活的内存管理

    • 处理内存浪涌而不崩溃

    • 适用于容器化或云环境

    • 性能调优和资源优化

    • 防止内存过度使用

-XX:+UseStringDeduplication (使用字符串去重)

  • Java 中的选项支持将字符串重复数据删除作为垃圾回收过程的一部分。字符串重复数据删除是一种技术,它允许 JVM 识别和删除内存中的重复字符串文本或相同的字符串对象,通过仅存储字符串值的一个副本来有效减少内存使用,即使它在应用程序中多次出现。-XX:+UseStringDeduplication

  • 优点:

    • 减少重复字符串的内存使用量

    • 优化具有许多字符串的大型应用程序中的内存

    • 适用于实习字符串

    • 帮助处理大型文本数据

    • 以最少的配置自动删除重复数据

    使用该标志是优化 Java 应用程序中内存使用的好方法,尤其是那些处理大量重复字符串值的应用程序。通过启用重复数据删除,您可以允许 JVM 消除堆中字符串的冗余副本,这可以显著节省内存并提高内存密集型应用程序的性能。-XX:+UseStringDeduplication

-XX:+ClassUnloadingWithConcurrentMark

  • Java 中的选项用于在垃圾回收的并发标记阶段启用类的并发卸载。在运行动态加载和卸载类的应用程序时,例如应用程序服务器(例如 Tomcat、Jetty)、框架或依赖于热交换或动态类加载的系统,此选项特别有用。-XX:+ClassUnloadingWithConcurrentMark

  • 优点:

    • 减少 GC 暂停时间

    • 改进了长期应用程序中的内存管理

    • 更好的服务器和容器可扩展性

    • 热插拔和框架

-XX:+使用 NUMA

  • 该选项用于为具有非一致性内存访问 (NUMA) 体系结构的系统优化 JVM。NUMA 是一种用于多处理器系统的内存设计,其中每个处理器都有自己的本地内存,但它也可以访问其他处理器的内存,尽管延迟更高。该选项使 JVM 能够优化基于 NUMA 的系统上的内存分配和垃圾回收,以提高性能。-XX:+UseNUMA JVM-XX:+UseNUMA

  • 优点:

    • 改善内存访问延迟和性能

    • 更好的 GC 效率

    • 优化内存分配

    • 在多插槽系统上具有更好的可扩展性

什么是 NUMA?

    在 NUMA 系统中,处理器连接到本地内存,并且每个处理器都可以比连接到其他处理器的内存更快地访问自己的本地内存。与统一内存访问 (UMA) 系统相反,所有处理器对所有内存的访问时间相同,而 NUMA 系统由于本地内存与远程内存的延迟不同,因此具有非对称内存访问。

    NUMA 架构通常用于具有多个处理器(或插槽)的大型服务器,通过确保尽可能多地在本地访问内存,可以提高性能。

-XX:+UseNUMA 有什么作用?

启用该选项时,JVM 将配置为通过考虑系统的 NUMA 拓扑来优化内存访问。具体来说,JVM 将:-XX:+UseNUMA

  • 从与执行给定任务的处理器关联的本地 NUMA 节点分配内存(尽可能)。

  • 使线程本地内存靠近运行线程的处理器,从而减少内存访问延迟。

  • 通过优化 JVM 跨多个 NUMA 节点管理堆和其他内存资源的方式,提高垃圾回收性能。

-XX:ConcGCThreads=<大小>

  • Java 中的选项允许您控制 JVM 在垃圾回收的并发阶段使用的并发 GC 线程数。-XX:ConcGCThreads

  • 优点:

    • 控制 GC 中的并行度

    • 最大限度地减少垃圾回收暂停时间

    • 根据硬件资源优化性能

    • 提高多线程应用程序的吞吐量

-XX:ConcGCThreads 有什么作用?

当 JVM 执行垃圾回收时,某些回收器(例如 G1 GC 或 ZGC)可以并发执行垃圾回收的各个阶段,这意味着它们与应用程序线程并行运行,以最大限度地减少暂停时间并提高吞吐量。该选项允许您指定 JVM 在这些并发 GC 阶段应使用多少个线程。-XX:ConcGCThreads

-XX:+ZUncommit

  • JVM 选项用于控制 ZGC 中内存管理的行为,特别是与 JVM 在为堆分配内存后如何从操作系统释放(或取消提交)内存有关。-XX:+ZUncommit

  • 优点:

    • 减少内存占用

    • 低内存环境中的动态内存回收

    • 避免内存碎片

    • 优化 GC 开销

-XX:+始终预设触控

  • JVM 选项用于预先接触 JVM 将用于其堆的内存页,这意味着 JVM 将在分配堆后立即接触每个内存页(即访问它),而不是在实际需要时延迟接触页面。-XX:+AlwaysPreTouch

  • 优点:

    • 减少应用程序运行时的延迟

    • 防止在初始执行期间出现操作系统页面错误

    • 在大型堆应用程序中预加载虚拟内存

    • 提高多核系统中的内存分配效率

    • 避免在启动期间进行内存交换

-XX:MaxGCPauseMillis=<大小>

  • Java 中的选项用于设置 GC 期间可接受的最大暂停时间的目标。当您指定 时,您是在指示 JVM 的垃圾回收器将最大 GC 暂停时间设为 100 毫秒。-XX:MaxGCPauseMillis-XX:MaxGCPauseMillis=100

  • 优点:

    • 最大限度地减少应用程序延迟

    • 控制和平衡吞吐量与暂停时间

    • 针对交互式或高通量系统进行了优化

    • G1 GC 中的垃圾回收调优

    • 改进了 Web 和服务器应用程序中的用户体验

    • 与 ZGC 和其他低延迟垃圾回收器一起使用

-XX:+使用大页面

  • JVM 选项用于使 JVM 能够将大内存页(也称为大页或 Superpages)用于 Java 堆和内存的其他部分,例如元空间和 JIT(即时)编译缓存。-XX:+UseLargePages

  • 优点:

    • 提高内存访问性能

    • 减少操作系统开销

    • 为内存密集型应用程序提供更好的性能

    • 更低的内存碎片

    • 减少内存分页活动

-XX:+UseLargePages 有什么作用?

操作系统通常以页面为单位管理内存,页面是内存分配和管理的基本单位。在许多系统上,内存页的大小通常为 4 KB,但某些系统支持更大的页大小 — 通常为 2 MB(在 x86-64 Linux 和 Windows 系统上),对于某些处理器和配置,甚至为 1 GB。

-XX:+UseTransparentHugePages

  • JVM 选项允许在 Java 虚拟机 (JVM) 中使用透明大页面 (THP) 进行内存管理。透明大页面是一项 Linux 内核功能,旨在自动管理大内存页面,从而提高内存密集型应用程序的性能。-XX:+UseTransparentHugePages

奖励:如何在 Java 和 Spring Boot 服务的 Dockerfile 中使用 JVM 参数。

Dockerfile 文件

ENTRYPOINT [
  "java",
  "-Xss256k",
  "-Xms1g",
  "-Xmx4g",
  "-XX:+UseZGC",
  "-XX:+UseStringDeduplication",
  "-XX:+ZGenerational",
  "-XX:SoftMaxHeapSize=4g",
  "-XX:+ClassUnloadingWithConcurrentMark",
  "-XX:+UseNUMA",
  "-XX:ConcGCThreads=4",
  "-XX:+ZUncommit",
  "-XX:+AlwaysPreTouch",
  "-XX:MaxGCPauseMillis=100",
  "-XX:+UseLargePages",
  "-XX:+UseTransparentHugePages",
  "org.springframework.boot.loader.launch.JarLauncher"]

    JVM 中的性能调优对于优化多线程和内存密集型应用程序至关重要,尤其是在实现高吞吐量和低延迟时。该过程包括微调垃圾回收、优化内存管理和调整并发设置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/925214.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

django authentication 登录注册

文章目录 前言一、django配置二、后端实现1.新建app2.编写view3.配置路由 三、前端编写1、index.html2、register.html3、 login.html 总结 前言 之前&#xff0c;写了django制作简易登录系统&#xff0c;这次利用django内置的authentication功能实现注册、登录 提示&#xff…

Python+Pytest+Yaml+Allure数据参数化(DDT)数据驱动(一)

我们在做数据之前要知道几个问题 1、在代码层面怎么来数据驱动 2、yaml文件是什么 3、怎么用yaml文件实现对应的数据驱动 我们用的是pytest框架所以相对来说是简单的&#xff0c;我们通过pytest框架来实现&#xff0c;而框架中要数据驱动用到我们装饰器就好啦pytest.mark.p…

WaveForms™ SDK 参考手册(翻译笔记与总结)

概述 WaveForms 提供了一个接口&#xff0c;允许用户与 Digilent Analog Design 硬件进行交互&#xff0c;例如 Analog DiscoveryTM、Analog Discovery 2TM、Analog Discovery ProTM、Digital DiscoveryTM、Discovery Power SupplyTM 和 Electronics ExplorerTM。虽然 WaveForm…

Python基础学习-12匿名函数lambda和map、filter

目录 1、匿名函数&#xff1a; lambda 2、Lambda的参数类型 3、map、 filter 4、本节总结 1、匿名函数&#xff1a; lambda 1&#xff09;语法&#xff1a; lambda arg1, arg2, …, argN : expression using arg 2&#xff09; lambda是一个表达式&#xff0c;而不是一个语…

pyqt5+yolo模型+多线程

界面开发 开发主窗口界面 from PyQt5 import QtWidgets from PyQt5 import QtCore,QtGui import sysclass MainWindow(QtWidgets.QMainWindow):def __init__(self):super().__init__()self.initUI()self.toolbar()# 创建菜单栏def initUI(self):menubar self.menuBar()file_m…

交通流量预测:基于交通流量数据建立模型

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

[Java]微服务配置管理

介绍 代码拆分为微服务后, 每个服务都有自己的配置文件, 而这些配置文件中有很多重复的配置, 并且配置变化后需要重启服务, 才能生效, 这样就会影响开发体验和效率 配置管理服务可以帮助我们集中管理公共的配置, 并且nacos就可以实现配置管理服务 配置共享 我们可以把微服务共…

【C++】入门【三】

本节目标 一、类的6个默认成员函数 二、 构造函数 三、析构函数 四、拷贝构造函数 五、赋值运算符重载 六、const成员函数 七、取地址及const取地址操作符重载 一、类的6个默认成员函数 如果类里一个成员都没有&#xff0c;简称空类空类中真的什么都没有吗&#xff1f;并不不是…

D78【 python 接口自动化学习】- python基础之HTTP

day78 pycharm创建项目并进行接口请求 学习日期&#xff1a;20241124 学习目标&#xff1a;http定义及实战 -- pycharm创建项目并进行接口请求 学习笔记&#xff1a; 安装requests 安装方式&#xff1a;pip/pip3 install requests 官网教程&#xff1a;Requests: HTTP fo…

UE5 实现组合键触发事件的方法

因为工作原因。 需要用大括号{和}来触发事件 但是在蓝图中搜了一下&#xff0c;发现键盘事件里根本就没有{}这两个键。 花费了一下午&#xff0c;终于找到解决的方法了&#xff0c;也就是增强输入的弦操作 首先创建一个项目 纯蓝图或者C都可行 进入到内容浏览器的默认页面 …

rabbitmq原理及命令

目录 一、RabbitMQ原理1、交换机&#xff08;Exchange&#xff09;fanoutdirecttopicheaders&#xff08;很少用到&#xff09; 2、队列Queue3、Virtual Hosts4、基础对象 二、RabbitMQ的一些基本操作:1、用户管理2、用户角色3、vhost4、开启web管理接口5、批量删除队列 一、Ra…

硬件基础22 反馈放大电路

目录 一、反馈的基本概念与分类 1、什么是反馈 2、直流反馈与交流反馈 3、正反馈与负反馈 4、串联反馈与并联反馈 5、电压反馈与电流反馈 二、负反馈四种组态 1、电压串联负反馈放大电路 2、电压并联负反馈放大电路 3、电流串联负反馈放大电路 4、电流并联负反馈放大…

新型大语言模型的预训练与后训练范式,苹果的AFM基础语言模型

前言&#xff1a;大型语言模型&#xff08;LLMs&#xff09;的发展历程可以说是非常长&#xff0c;从早期的GPT模型一路走到了今天这些复杂的、公开权重的大型语言模型。最初&#xff0c;LLM的训练过程只关注预训练&#xff0c;但后来逐步扩展到了包括预训练和后训练在内的完整…

网络知识1-TCP/IP模型

从用户端到服务端&#xff0c;tcp/ip模型可分为应用层、传输层、网络层、网络接口层 以下使用寄快递为例进行解释 应用层职责&#xff1a; 只关注与为用户提供应用功能&#xff0c;如HTTP、FTP、telnet、DNS、SMTP等 &#xff0c;应用层的职责就像我们寄快递时将快递给快递员…

【计算机视觉】图像基本操作

1. 数字图像表示 一幅尺寸为MN的图像可以用矩阵表示&#xff0c;每个矩阵元素代表一个像素&#xff0c;元素的值代表这个位置图像的亮度&#xff1b;其中&#xff0c;彩色图像使用3维矩阵MN3表示&#xff1b;对于图像显示来说&#xff0c;一般使用无符号8位整数来表示图像亮度&…

爬虫与反爬-旋转验证码突破方案(知名短视频、TK海外版 及 某东等等)

概述&#xff1a;文本对旋转验证码进行了突破及讲述了实现原理&#xff0c;代码使用纯算法 OpenCV&#xff0c;使用代价较小同时不用安装一大堆AI训练相关的模组&#xff0c;方便且能够快速上手 当前亲自验证了能够支持的网站&#xff1a;国内知名短视频平台、海外版 以及 某东…

STM32C011开发(1)----开发板测试

STM32C011开发----1.开发板测试 概述硬件准备视频教学样品申请源码下载参考程序生成STM32CUBEMX串口配置LED配置堆栈设置串口重定向主循环演示 概述 STM32C011F4P6-TSSOP20 评估套件可以使用户能够无缝评估 STM32C0 系列TSSOP20 封装的微控制器功能&#xff0c;基于 ARM Corte…

达梦数据库文件故障的恢复方法

目录 1、概述 1.1 概述 1.2 环境介绍 2、使用备份集的恢复方法 2.1 实验准备 2.2 误删除“用户表空间数据文件” 2.3 误删除SYSTEM.DBF 2.4 误删除ROLL.DBF 2.5 REDO日志文件 3、无备份集的恢复方法 3.1 误删除“表空间数据文件” 3.2误删除控制文件 3.3 误删除RO…

JVM:即时编译器,C2 Compiler,堆外内存排查

1&#xff0c;即时编译器 1.1&#xff0c;基本概念 常见的编译型语言如C&#xff0c;通常会把代码直接编译成CPU所能理解的机器码来运行。而Java为了实现“一次编译&#xff0c;处处运行”的特性&#xff0c;把编译的过程分成两部分&#xff0c;首先它会先由javac编译成通用的…

rocylinux9.4安装prometheus监控

一.上传软件包 具体的软件包如下&#xff0c;其中kubernetes-mixin是下载的监控kubernetes的一些监控规则、dashbaordd等。 二.Prometheus配置 1.promethes软件安装 #解压上传后的软件包 [rootlocalhost ] cd /opt [rootlocalhost opt]# tar xf prometheus-2.35.3.linux-amd…