我需要多少个线程?

这取决于您的应用程序。 但是对于那些希望对如何从生产站点购买的所有昂贵内核中挤出更多资金的人来说,请多多包涵,我将阐明围绕多线程 Java应用程序的奥秘。

内容针对最典型的Java EE应用程序进行了“优化”,该应用程序具有Web前端,允许最终用户在应用程序内发起许多小交易。 每个交易的重要部分都在等待一些外部资源。 例如从数据库或任何其他集成数据源返回的查询。 但是大多数内容也与其他应用程序相关。 例如繁重的计算建模应用程序或处理数据的批处理过程。 Multithreading

但是,让我们从基础开始。 在我们描述的应用程序类型中,您倾向于有很多用户与您的应用程序进行交互。 是成千上万同时活动的用户还是成千上万的用户-所有这些用户都希望应用程序及时响应他们。 这就是您对操作系统设计人员感激的地方。 那些家伙在所有人甚至还没有想到HTTP协议之前就已经想出了这种解决方法。

在您在软件中创建更多线程然后基础硬件可以同时执行的情况下,使用的解决方案很有用。 在硬件级别上,您还具有线程。 例如您CPU上的内核或具有超线程功能的虚拟化环境(如Intel)。 无论如何,我们手头的应用程序可以轻易产生比基础硬件直接支持更多的软件线程。 您的OS现在启动的功能类似于简单的循环调度。 在此期间,每个软件线程轮流执行,称为时间片,以在实际硬件上运行。

时间分片允许所有线程进行。 否则,很容易想象这样一种情况,其中一个用户发起了一项真正昂贵的任务,而为其他用户提供服务的所有其他线程却挨饿了。

因此,我们正在经历这个惊人的时间切片。 那么将线程数设置为LARGE_NUMBER并完成该操作是否可行? 显然没有。 其中包括间接费用,实际上甚至包括几种间接费用。 因此,为了在调整线程时做出明智的决定,让我们介绍一下由LARGE_NUMBER个线程一一导致的问题。

注册状态保存/恢复 。 处理器寄存器确实包含很多状态。 每次计划程序移至下一个任务时,哪个文件都会保存到缓存中。 然后在时间到来时恢复。 幸运的是,调度程序分配的时间片相对较大。 因此,在多线程环境中,来往于注册表的保存/还原开销通常不会成为我们最卑鄙的敌人。

。 当时间片被锁持有线程占用时,所有其他等待此特定锁的线程现在都必须等待。 直到锁持有者获得另一片和释放锁的机会。 因此,如果您正在进行大量同步,则请检查线程在高负载下的行为。 由于锁持有线程,您的同步代码有可能导致发生更多上下文切换。 分析线程转储将是开始调查此危险的好地方。

释放虚拟内存 。 所有操作系统都利用交换到外部存储的虚拟内存。 通过在需要时将内存中的最近最少使用(LRU)数据交换到磁盘驱动器。 哪个好 但是,如果您现在正在使用有限的内存运行应用程序,并且有许多线程在争夺将其堆栈和私有数据放入内存的空间,那么您可能会遇到问题。

在每个时间片回合中,您可能都有线程在外部存储中交换数据。 这将大大降低应用程序的性能。 特别是对于问题特别严重的Java应用程序。 每当您开始交换堆时,每次Full GC运行都将花费很长时间。 一些专家建议关闭操作系统级别的交换功能。 在Linux发行版中,您可以通过swapoff –a来实现。

但好消息是,过去几年该问题已大大减少。 两者均具有广泛的64位OS部署,从而可以使用更大的RAM和SSD来代替世界各地的传统旋转磁盘。 但是要注意敌人,如果有疑问,请检查进程的页面进/出比例。

最后但并非最不重要的- 线程缓存状态 。 在所有现代处理器中,您都在内核旁边建立了高速缓存,从而使操作完成速度比RAM中的数据快100倍。 绝对很棒。 但是不妙的是,当线程开始为这个极其有限的空间而战时。 然后,负责清理的LRU算法再次开始清理缓存,为新数据腾出空间。 这可能是其时间片中输入缓存的数据最后一个线程。 因此,您的线程最终可能会从缓存中清除彼此的数据。 再次造成了严重的问题。

如果您在Intel体系结构上运行,那么在这种情况下可能会帮助您的解决方案是Intel的VTune Performance Analyzer

因此,也许将LARGE_NUMBER个线程放入应用程序配置中并不是最明智的选择。 但是在配置线程数时会给出什么提示?

首先,可以将某些应用程序配置为以等于基础硬件线程的线程数运行。 对于典型的Web应用程序可能不是这种情况,但是肯定有很好的案例支持此策略。 请注意,当您的线程在诸如关系数据库之类的外部资源后面等待时,这些线程将从循环调度中删除。 因此,在典型的Java EE应用程序中,拥有比基础硬件更多的线程并且仍在无锁争用或其他问题的情况下运行并不罕见。

接下来,明智的做法是将线程划分为不同用途的不同组。 典型的情况是将计算线程与I / O线程分开。 计算线程通常在大多数时间都处于繁忙状态,因此将其数量保持在底层硬件容量以下非常重要。 另一方面,I / O线程(例如需要数据库往返的操作)在大多数时间里都在等待。 因此,不会过于频繁地为争取资源做出贡献。 因此,使I / O线程(方式)的数量大于支持您的应用程序的硬件线程的数量是安全的。

然后,您应该最小化线程的创建和销毁。 由于这些操作往往很昂贵,因此请查看合并解决方案。 您可能正在使用已经内置了线程池的Java EE基础结构,或者可以查看java.util.concurrent.ThreadPoolExecutor之类的解决方案。 但是,当您有时需要增加或减少线程数时,也不要太害羞–只需避免在与下一个HTTP请求或JDBC连接一样可预测的事件上创建和删除它们。

作为最后的建议,我们将提供最重要的建议。 测量。 调整线程池的大小,并在负载下运行应用程序。 测量吞吐量和延迟。 然后进行优化以实现您的目标。 然后再次测量。 冲洗并重复。 直到您对结果满意为止。

不要对CPU的性能做任何假设。 如今,CPU中发生的魔力数量巨大。 还要注意,虚拟化和JIT运行时优化也会增加额外的复杂性。 但是这些将成为另一个话题。 如果您订阅我们的Twitter feed ,将会及时收到通知。

在撰写本文时,以下资源被用作灵感来源:

  • Arch Robinson的帖子,关于多少线程会影响性能
  • 不同的Stackoverflow问题和评论:
    • http://stackoverflow.com/questions/130506/how-many-threads-should-i-use-in-my-java-program

是的。 本文是有关我们在内存泄漏以外其他问题领域进行研究的第一条提示。 但是我们尚无法预测是否以及何时要为所有锁定和缓存争用问题提供解决方案。 但是绝对有希望。

参考: 我需要多少个线程? 由我们的JCG合作伙伴 Nikita Salnikov Tarnovski在Plumbr Blog博客上获得。

翻译自: https://www.javacodegeeks.com/2013/01/how-many-threads-do-i-need.html

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

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

相关文章

H5网页适配 iPhoneX,就是这么简单

iPhoneX 取消了物理按键,改成底部小黑条,这一改动导致网页出现了比较尴尬的屏幕适配问题。对于网页而言,顶部(刘海部位)的适配问题浏览器已经做了处理,所以我们只需要关注底部与小黑条的适配问题即可&#…

数字校园-云资源平台 2014.10.26-人人通共享空间

近期,教育部在统计学校信息化建设情况,当中一项重要内容,作为三通两平台的一个环节,就是学校开通人人通空间的情况,网上普及了一下知识,不就是十多年前就玩的学校博客的变种吗,网上有一些产品,也是没有热闹起来,为要求而要求的多,既然要求,就来一个吧,花了几天时间,也做了一个.…

Lucene –快速添加索引和搜索功能

什么是Lucene? Apache LuceneTM是完全用Java编写的高性能,功能齐全的文本搜索引擎库。 它是一项适用于几乎所有需要全文搜索的应用程序的技术,尤其是跨平台的应用程序。 Lucene可以纯文本,整数,索引PDF,Of…

《深入理解Java虚拟机》读书笔记3--垃圾回收算法

转载:http://blog.csdn.net/tjiyu/article/details/53983064 下面先来了解Java虚拟机垃圾回收的几种常见算法:标记-清除算法、复制算法、标记-整理算法、分代收集算法、火车算法,介绍它们的算法思路,有什么优点和缺点,…

Flex布局(一)flex-direction

采用Flex布局的元素,被称为Flex容器(flex container),简称"容器"。其所有子元素自动成为容器成员,成为Flex项目(Flex item),简称"项目" Flex-direction调整主轴方向(默认为水平方向)包…

登录网页后要弹出一个新标签_连永久链接都不会,还做什么新媒体?

上次给主编大大发的预览链接失效了,被骂得狗血淋头。大部分运营人可能都遇到过这种情况,忽视了预览生成的链接只是临时的,在12小时后或超过500阅读量后就会失效。一个疏忽,给自己带来了不必要的麻烦,耽误工作&#xff…

static_cast与dynamic_cast转换

static_cast与dynamic_cast转换   一 C语言中存在着两种类型转换: 隐式转换和显式转换 隐式转换:不同数据类型之间赋值和运算,函数调用传递参数……编译器完成 char ch;int i ch; 显示转换:在类型前增加 :&#xff…

vue使用iview Timeline 时间轴不显示问题

vue Timeline 时间轴不显示渲染的效果 官网代码 <Timeline pending><TimelineItem>发布1.0版本</TimelineItem><TimelineItem>发布2.0版本</TimelineItem><TimelineItem>发布3.0版本</TimelineItem><TimelineItem><a href…

Java EE 6 Web配置文件。 在云上。 简单。

Java SE还可以。 Java EE是邪恶的。 这就是我一直想的。 好吧&#xff0c;现在不再了。 让我分享我的经验。 几周前&#xff0c;我开始考虑将旧版spring hibernate tomcat应用程序移植到新平台上&#xff1a; SAP NetWeaver云 。 我知道您在极客那里的想法&#xff1a;…

Kubernetes核心概念总结

1、基础架构 1.1 Master Master节点上面主要由四个模块组成&#xff1a;APIServer、scheduler、controller manager、etcd。 APIServer。APIServer负责对外提供RESTful的Kubernetes API服务&#xff0c;它是系统管理指令的统一入口&#xff0c;任何对资源进行增删改查的操作都要…

php连接mysql数据,php连接mysql数据库

$sql_link mysql_connect("主机名","登入用户名","登入用户名密码");如果连接成功&#xff0c;就会返回一个mysql句柄,可以简单的理解成这个$sql_link 是php跟mysql的一个桥梁&#xff0c;通过该桥梁我们可以进入到mysql。进入到mysql之后&…

url存在宽字节跨站漏洞_利用WebSocket跨站劫持(CSWH)漏洞接管帐户

在一次漏洞悬赏活动中&#xff0c;我发现了一个使用WebSocket连接的应用&#xff0c;所以我检查了WebSocket URL&#xff0c;发现它很容易受到CSWH的攻击(WebSocket跨站劫持)有关CSWH的更多详细信息&#xff0c;可以访问以下链接了解https://www.christian-schneider.net/Cross…

php 数组对比 unset,如何区分PHP中unset,array_splice的区别

1.使用的函数a.函数unset()unset ( mixed $var , mixed $... ? ) : voidunset()销毁指定的变量。b.函数array_slice()array_splice(array,start,length,array)array表示数组。start表示删除元素的开始位置。length表示被移除的元素个数&#xff0c;也是被返回数组的长度。(可…

前端基础-CSS的各种选择器的特点以及CSS的三大特性

一、 基本选择器二、 后代选择器、子元素选择器三、 兄弟选择器四、 交集选择器与并集选择器五、 序列选择器六、 属性选择器七、 伪类选择器八、 伪元素选择器九、 CSS三大特性 一、 基本选择器 1、id选择器 #1、作用&#xff1a;根据指定的id名称&#xff0c;在当前界面中找…

使用JavaCV进行手和手指检测

这篇文章是Andrew Davison博士发布的有关自然用户界面&#xff08;NUI&#xff09;系列的一部分&#xff0c;内容涉及使用JavaCV从网络摄像头视频提要中检测手。 注意&#xff1a;可以从http://fivedots.coe.psu.ac.th/~ad/jg/nui055/下载本章的所有源代码。 第5章的彩色斑点检…

不能装载文档控件。请在检查浏览器的选项中检查浏览器的安全设置_【2020年网络安全宣传周】如何正确设置浏览器...

李夏是一个公司的职员&#xff0c;一天晚上加班赶制文档&#xff0c;由于要向客户汇报产品情况&#xff0c;需要获取大量网上信息&#xff0c;然而在制作中却发现浏览器的网页打不开了。第二天原计划向客户展示的材料未能完整汇总&#xff0c;客户见面对接效果也打了折扣。在当…

用装饰器设计模式装饰

装饰图案是广泛使用的结构图案之一。 此模式在运行时动态更改对象的功能&#xff0c;而不会影响对象的现有功能。 简而言之&#xff0c;此模式通过包装将附加功能添加到对象。 问题陈述&#xff1a; 想像一下我们有一个比萨饼&#xff0c;该比萨饼已经用番茄和奶酪烤制的情况。…

vcpkg安装_微软牌包管理器vcpkg更新及路线图计划

蝎子vcpkg是一套跨平台&#xff0c;开源的C/C库管理器&#xff0c;今天的这篇文章是有关vcpkg主题的2020年4月博文更新。在这篇文章中&#xff0c;我们将分享有关vcpkg 2020.04发布版本的一些信息以及vcpkg的路线图(roadmap)&#xff0c;我们会在这里持续地发布有关vcpkg的最新…

CSS 盒模型与box-sizing

一、盒模型 一个web页面由许多html元素组成&#xff0c;而每一个html元素都可以表示为一个矩形的盒子&#xff0c;CSS盒模型正是描述这些矩形盒子的存在。 MDN的描述&#xff1a; When laying out a document, the browsers rendering engine represents each element as a r…

Java课程设计 购物车系统(个人博客) 201521123052 蓝锦明

1. 团队课程设计博客链接 课程设计团队博客 2. 个人负责模块或任务说明 &#xff08;1&#xff09;制作图形菜单引导界面 &#xff08;2&#xff09;定义各获取和输出类函数 3. 自己的代码提交记录截图 4. 自己负责模块或任务详细说明 import java.text.NumberFormat; public c…