关于项目中加入线程池,导致JVM性能急剧下降的问题

在项目中,为了提高新系统服务的并发处理能力,我在项目中加入了线程池。
由于原来的项目是单线程的一个服务,或者说是一个少线程的服务.
所以公司前辈,将jvm的TLAB 参数配置进行关闭了。
TLAB(Thread Local Allocation Buffer)是在堆上开辟的内存空间。在Java虚拟机(JVM)中,堆是用于存储对象实例的主要内存区域。为了优化对象分配的性能,JVM引入了TLAB机制。
当TLAB开启时,每个线程在堆上会有一个私有的内存区域用于对象分配。这减少了线程间的同步开销,因为线程在自己的TLAB中分配对象时,不需要竞争全局锁。因此,提高了对象分配的效率,特别是在高并发场景下。

这样问题就明白了,由于我加入了线程池,而TLAB 参数又被关闭了,导致多线程进行了大麻烦锁的竞争,从而jvm的对象分配的效率急剧下降。解决办法开启TLAB 参数 -XX:+UseTLAB 关闭 -XX:-UseTLAB

为什么前辈要关闭TLAB 参数 呢? 应为在单线程 或者在线程数少的情况下 ,TLAB 参数 关闭是更优于开启TLAB 参数 的。

在以下情况下,不开启TLAB可能会比开启TLAB更有优势:

小内存堆:当JVM的堆内存设置得相对较小,并且线程数量也相对较少时,不开启TLAB可能有助于减少内存碎片和提高内存利用率。由于TLAB是线程专用的内存分配区域,过多的线程使用TLAB可能会增加内存管理的复杂性。
低并发场景:在并发程度较低的应用程序中,线程间的竞争本身就较少,因此不开启TLAB可能不会对性能产生显著影响。在这种情况下,减少JVM的复杂性和内存开销可能更为重要。
特定性能需求:在某些特定场景中,不开启TLAB可能会获得更好的性能。这可能是因为这些场景中的对象分配模式与TLAB的默认行为不匹配,导致开启TLAB反而降低了性能。在这种情况下,需要对应用程序进行深入的性能分析和测试,以确定最佳的配置。

性能影响:

开启TLAB:当TLAB开启时,每个线程在堆上会有一个私有的内存区域用于对象分配。这减少了线程间的同步开销,因为线程在自己的TLAB中分配对象时,不需要竞争全局锁。因此,提高了对象分配的效率,特别是在高并发场景下。
不开启TLAB:如果没有启用TLAB,多个线程在创建对象和申请内存时,可能需要竞争同一内存区域。这增加了线程间的同步开销,可能导致性能下降,特别是在有大量对象分配和销毁的场景中。


内存管理:


开启TLAB:JVM会自动为每个线程分配TLAB,并根据线程的数量和分配情况动态调整TLAB的大小。一旦TLAB的空间用完,线程需要重新竞争全局分配锁以获取新的TLAB空间。这可能会导致在某些极端情况下,内存分配的延迟。
不开启TLAB:没有TLAB的情况下,所有线程直接在堆上进行对象分配,这可能导致更频繁的锁竞争和同步操作。


编程模型:


对于开发者来说,无论TLAB是否开启,Java编程模型都保持不变。开发者不需要关心对象是在TLAB中分配还是在堆上直接分配,因为这些都是JVM内部自动管理的。


资源利用:


开启TLAB:虽然TLAB可以提高性能,但它也可能导致一些内存空间的浪费。例如,如果TLAB的大小设置得过大,而线程实际使用的对象大小远小于TLAB的大小,那么这部分未使用的空间就会浪费。相反,如果TLAB太小,线程可能需要频繁地申请新的TLAB,这也会带来额外的开销。
不开启TLAB:虽然可以避免TLAB带来的空间浪费问题,但可能会因为线程间的同步开销而降低性能。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络 -- 网络编程基础

一 学习准备 1.1 IP地址 在 前文中我们提到过: IP 是全球网络的基础,使用 IP 地址来标识公网环境下主机的唯一性,我们可以根据 目的IP地址 进行跨路由器的远端通信。 但是我们也提到了,通过 IP 地址,只能寻找到目标主机&#xff…

视频质量度量VQM算法详细介绍

视频质量评价 视频质量评价(Video Quality Assessment,VQA)是指通过主观、客观的方式对视频图像的内容、画质等,进行感知、衡量与评价。 ITU definations subjective assessment: the determination of the quality or impairment of programme-like pictures presented…

MASA Framework-原理分析(6)

MASA Framework的原理分析主要涉及到其核心组件、架构设计和运行机制等多个方面。以下是对MASA Framework原理的深入解析: 1. 核心组件与功能 MASA Framework的核心组件包括服务容器、数据存储、消息队列以及监控和管理工具等。这些组件共同协作,为开发…

桌面应用框架概论

目录 桌面应用框架概论 1.介绍 2.优缺点 3.总结 桌面应用框架概论 1.介绍 桌面应用框架种类繁多,以下是一些主要的框架: Electron:这是一个用于创建跨平台桌面应用的开源框架。它允许开发者使用Web技术(HTML、CSS和JavaScript)来构建桌面应用程序,使得桌面应用的开…

字符串的一些有趣案例

文章目录 简介删除文本中的括号和其中的文本 简介 分享python 字符串操作的一些有趣的案例: 正则表达式format … 删除文本中的括号和其中的文本 存在中英文括号混用,故要考虑到所有可能到情况 import re def remove_all_parentheses(text): # 正…

MongoDB聚合运算符:$replaceOne

MongoDB聚合运算符:$replaceOne 文章目录 MongoDB聚合运算符:$replaceOne语法参数字段说明 使用$replaceOne 与 Null$replaceOne 和排序规则$replaceOne 和 Unicode 规范化 举例 $replaceOne聚合运算在输入的字符串中搜索目标字符串,并使用指…

【代码随想录】【动态规划】day48:打家劫舍

打家劫舍1 def rob(self, nums):""":type nums: List[int]:rtype: int"""# 分为两个情况,偷还是不偷,# dp[i]为考虑到第i个房间时的最大值if len(nums) 0: # 如果没有房屋,返回0return 0if len(nums) 1: #…

【 书生·浦语大模型实战营】作业(五):LMDeploy 量化部署

【 书生浦语大模型实战营】作业(五):LMDeploy 量化部署 🎉AI学习星球推荐: GoAI的学习社区 知识星球是一个致力于提供《机器学习 | 深度学习 | CV | NLP | 大模型 | 多模态 | AIGC 》各个最新AI方向综述、论文等成体系…

Linux debian gdb dump

1.开发背景 记录 debian 下应用程序崩溃调试方法 2.开发需求 程序越界可以定位到越界的位置附近 3.开发环境 debian 操作系统,如果不支持需要查看是否存在对应的可执行文件 4.实现步骤 4.1 设置 dump 输出大小 ulimit -c unlimited # 设置输出大小 生成core 文…

【QT+OpenCV】车牌号检测 学习记录 遇到的问题

【QTOpenCV】车牌号检测 学习记录 首先在QT里面配置好OpenCV .pro文件中加入: INCLUDEPATH G:/opencv/build/include LIBS -L"G:/opencv/build/x64/vc14/lib"\-lopencv_core \-lopencv_imgproc \-lopencv_highgui \-lopencv_ml \-lopencv_video \-lo.c…

Linux下SPI设备驱动实验:使用内核提供的读写SPI设备中的数据的函数

一. 简介 前面文章的学习,已经实现了 读写SPI设备中数据的功能。文章如下: Linux下SPI设备驱动实验:验证读写SPI设备中数据的函数功能-CSDN博客 本文来使用内核提供的读写SPI设备中的数据的API函数,来实现读写SPI设备中数据。 …

JSON文件初识

JSON(JavaScript Object Notation)是一种用于存储和交换数据的轻量级数据格式。它独立于任何编程语言,因此可以在各种语言环境中使用,包括网页、服务器、应用程序等。JSON的简洁性、可读性以及易于解析的特性,使其在网…

HTML5+JavaScript实现本地视频/音频播放器

HTML5JavaScript实现本地视频/音频播放器 HTML5 提供了本地视频和音频播放器的支持&#xff0c;通过 <video> 和 <audio> 标签&#xff0c;这些标签支持多种媒体格式&#xff0c;并且可以通过 JavaScript 进行控制&#xff0c;实现功能比较完整的本地视频音频播放器…

MySQL 8.0 新特性之 Clone Plugin

个人感觉&#xff0c;主要还是为 Group Replication 服务。在 Group Replication 中&#xff0c;如果要添加一个新的节点&#xff0c;这个节点差异数据的补齐是通过分布式恢复&#xff08; Distributed Recovery &#xff09;来实现的。 在 MySQL 8.0.17 之前&#xff0c;只支…

【数据结构】队列(链表模拟队列)

学习本章节必须具备 单链表的前置知识&#xff0c; 建议提前学习&#xff1a;点击链接学习&#xff1a;单链表各种功能函数 细节 详解 本章节是学习用 单链表模拟队列 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff…

javase基础汇总学习

目录 背景步骤宏观微观理论基础用法面向对象数据类型基础语法&#xff08;关于方法&#xff09;try&#xff08;正常的逻辑代码&#xff09;catch&#xff08;这个和异常有关系&#xff09;finally&#xff08;经典面试题&#xff09; 高阶使用序列化泛型注解反射 总结 背景 后…

大型网站系统架构演化实例_3.使用服务集群改善网站并发处理能力

1.使用服务集群改善网站并发处理能力 使用集群是网站解决高并发、海量数据问题的常用手段。当一台服务器的处理能力、存储空间不足时&#xff0c;不要企图去更换更强大的服务器&#xff0c;对大型网站而言&#xff0c;不管多么强大的服务器&#xff0c;对大型网站而言&…

go interface stuct结构练习报错,结构体定义与main函数位置,结构体变量后加逗号“,”

import "fmt"func main() {//var x interface{} func(x int)string{// return fmt.Sprintf("d:%d",x)//}////switch v:x.(type) { // 局部变量v是类型转换后的结果//case nil:// println("nil")//case*int:// println(*v)//case func…

Jenkins 的构建时执行时间问题

我们希望我的项目能够在特定的时间自动执行&#xff0c;我们需要设定一个定时任务。 Jenkins 的定时任务是通过 Cron 任务来实现的&#xff0c;但是由有点不一样。 H/2 * * * * 比如说上面的设置就是每 2 分钟执行一次。 希望每分钟执行一次 Jenkins 的每分钟执行一次的设置…

【AI工具之Prezo如何自动生成PPT操作步骤】

先说优缺点&#xff1a; 最大的优点就是免费&#xff08;但说实话功能和体验方面很弱&#xff09;支持中文提问&#xff08;最好用英文&#xff09;&#xff0c;智能生成图文&#xff08;但是只能生成英文内容&#xff09;可以AI生成图片&#xff0c;图片很精美酷炫&#xff0…