线程池默认多少个线程_我需要多少个线程?

线程池默认多少个线程

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

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

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

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

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

因此,我们正在经历这个惊人的时间切片。 那么将线程数设置为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/350032.shtml

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

相关文章

mysql error writing_MySQL:Error writing file (Errcode: 28)解决方法

问题描述:在执行创建表语句时提示:mysql> CREATE TABLE cash_request (id int(11) NOT NULL auto_increment,dev_id int(11) NOT NULL,bank_account_info varchar(255) NOT NULL,money int(11) NOT NULL,status tinyint(1) NOT NULL default 1,is_fan…

[暑假集训Day4T3]曲线

三分模板。 三分法求单峰函数最优值,之后每次取所有二次函数最优值即可 #pragma GCC optimize(3,"Ofast","inline") #include<iostream> #include<cstdio> #define N 100005 #define eps 1e-9 using namespace std; int read() {int x0,f1;cha…

模拟Spring Security上下文进行单元测试

今天&#xff0c;在为一种Java方法编写单元测试用例时&#xff0c;如下所示&#xff1a; public ApplicationUser getApplicationUser() {ApplicationUser applicationUser (ApplicationUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal();return…

mysql semi-synchronous_MySQL Semisynchronous Replication介绍

前言MySQL 5.5版本之前默认的复制是异步(Asynchronous )模式的, MySQL 5.5 以plugins的方式提供了Semisynchronous Replication 模式。在介绍 semi sync 之前,我们先了解&#xff1a;半同步 Asynchronous 和 同步 Synchronous 。异步复制模式主库将已经提交的事务event 写入bin…

Jquery屏蔽回车键

1 $(function(){2 3 $(“#tagForm input”).keypress(4 5 function(event){6 7 if(event.keyCode 13){8 9 returnfalse;10 11 }12 13 });14 15 })转载于:https://www.cnblogs.com/pfs1314/archive/2011/04/19/2020706.html

滑坡泥石流的防御措施_滑坡泥石流防御

什么是滑坡、泥石流?滑坡是指山坡在河流冲刷、降雨、地震、人工切坡等因素影响下&#xff0c;土层或岩层整体或分散地顺斜坡向下滑动的现象。滑坡也叫地滑&#xff0c;群众中还有“走山”、“垮山”或“山剥皮”等俗称。泥石流是指在降水、溃坝或冰雪融化形成的地面流水作用下…

Event Delegate(代理)异常:该委托必须有一个目标 解决方法

正文待叙转载于:https://www.cnblogs.com/kodong/archive/2013/04/19/3031212.html

自定义注解 实现自定义消息_实现自定义的未来

自定义注解 实现自定义消息上一次我们学习了java.util.concurrent.Future<T>背后的原理 。 我们还发现&#xff0c; Future<T>通常由库或框架返回。 但是&#xff0c;没有什么可以阻止我们在有意义的情况下自行实现所有功能。 它不是特别复杂&#xff0c;可以显着改…

菜单 java_java 菜单

继承体系MenuBar,Menu,MenuItem之间的关系&#xff1a;先创建菜单条&#xff0c;再创建菜单&#xff0c;每一个菜单中建立菜单项。也可以菜单添加到菜单中&#xff0c;作为子菜单。通过setMenuBar()方法&#xff0c;将菜单添加到Frame中。package june610;import java.awt.File…

Jsp、Servlet

1 forward、redirect forward 转发是服务器行为&#xff0c;浏览器根本不知道服务器发送的内容是从哪儿来&#xff0c;所以它的地址栏中还是原来的地址。 redirect 重定向是客户端行为。redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址&#xff0c;一…

Java Finalizer和Java文件输入/输出流

在与主题直接合作或花时间学习它们之后&#xff0c;我经常会发现自己在网上注意到更多主题。 最近的Stephen Connolly &#xff08; CloudBees &#xff09;发表FileInputStream / FileOutputStream被认为有害的消息引起了我的注意&#xff0c;因为我最近在Java的finalizer中遇…

java 运行main_使用maven运行Java Main的三种方法解析

maven使用exec插件运行java main方法&#xff0c;以下是3种不同的操作方式。一、从命令行运行1、运行前先编译代码&#xff0c;exec&#xff1a;java不会自动编译代码&#xff0c;你需要手动执行mvn compile来完成编译。mvn compile2、编译完成后&#xff0c;执行exec运行main方…

CentOS7 修复boot目录

这里为了达到实验目的&#xff0c;首先删除boot目录下所有内容 重启后发现系统进不去了&#xff0c;这正是我们想要的 进入系统救援模式&#xff0c;以重新引导系统 进入救援模式后&#xff0c;输入以下命令进行修复boot目录 重启后&#xff0c;能正常引导系统了 转载于:https:…

java corepoolsize_理解ThreadPoolExecutor线程池的corePoolSize、maximumPoolSize和poolSize

我们知道&#xff0c;受限于硬件、内存和性能&#xff0c;我们不可能无限制的创建任意数量的线程&#xff0c;因为每一台机器允许的最大线程是一个有界值。也就是说ThreadPoolExecutor管理的线程数量是有界的。线程池就是用这些有限个数的线程&#xff0c;去执行提交的任务。然…

开式蓄冷罐与闭式蓄冷罐_一罐来统治所有人

开式蓄冷罐与闭式蓄冷罐跳下内存通道 早在1998年&#xff0c;当我是一名C / C 开发人员时&#xff0c;尝试使用Java时&#xff0c;有关该语言的一些内容对我来说就显得有些恼火了。 我记得很担心这些 为什么没有合适的编辑器呢&#xff1f; C / C 有很多。 我为Java拥有的只是…

嵊州D5T2 折纸 folding

折纸 folding 【问题描述】 在非常紧张的 NOIP 考试中&#xff0c;有人喜欢啃指甲&#xff0c;有人喜欢转铅笔&#xff0c;有人喜欢撕 纸条&#xff0c;……而小 x 喜欢迷折纸。 现有一个 W * H 的矩形纸张&#xff0c;监考老师想知道&#xff0c;小 x 至少要折多少次才能使 矩…

使用Portworx和Couchbase的有状态容器

容器本应是短暂的&#xff0c;因此可以很好地扩展以用于无状态应用程序。 有状态的容器&#xff08;例如Couchbase&#xff09;需要区别对待。 管理Docker容器的持久性概述了如何管理有状态容器的持久性。 该博客将说明如何使用Docker Volume Plugins和Portworx创建有状态的容…

java和jvm_java 和 JVM

C和Java的区别指针&#xff1a;java中不存在指针的概念&#xff0c;编程者无法直接通过指针来直接访问内存&#xff0c;有利于维护java程序的安全多重继承&#xff1a;C支持多重继承&#xff0c;java不支持多重继承&#xff0c;但是允许一个类继承多个接口来实现多重继承的问题…

Redis 集群_主从复制_哨兵模型

1 redis集群简介 1.1 集群的概念 所谓的集群&#xff0c;就是通过添加服务器的数量&#xff0c;提供相同的服务&#xff0c;从而让服务器达到一个稳定、高效的状态。 1.1.1 使用redis集群的必要性 问题&#xff1a;我们已经部署好了redis&#xff0c;并且能启动一个redis&#…

java 7 update 17_Java version 7, Update 17 is NOT recongnized by FireFox version 19.0.2

选择的解决方案Reply to my own post:Out of all the solutions posted regarding Java install problems, I gleaned one thing: A re-install of Java and a re-install of Firefox may well solve the problem.Well, for me, thus far, it has.The simple steps I followed:…