一台Java服务器如何跑多少个线程

一台Java服务器如何跑多少个线程,第1张

首先确认你是cpu密集型的还是io密集型的,

如果是cpu密集型的线程数可以设置到和cpu个数一致,

如果是io密集型的,首先需要确认你io wait的时间,线程数和io wait时间成正比, 具体需要根据测试得出。

首先有个基本问题需要了解一下:

这里所说java里获得一个进程的内存使用情况和cpu运行时间,是指在java内部获取一个纯外部进程的内存与cpu时间呢,还是指在java内部,由java启动的进程的内存与cpu时间。

如果是第一种情况,那你还需要在java内部再起一个进程,通过执行 *** 作系统的shell命令来查看那个进程的运行状态。比如那个外部进程的ID为3119,则执行cat /proc/3119/status | grep VmRSS就可以过滤出该进程的物理内存占用量。

如果是第二种情况,(假定你问的就是这种情况)。

先说内存占用量:一般说来,你可以使用这两种方式获取内存使用情况

方式一:

MemoryMXBean memoryMXBean = ManagementFactorygetMemoryMXBean();

MemoryUsage memoryUsage = memoryMXBeangetHeapMemoryUsage(); //椎内存使用情况

long totalMemorySize = memoryUsagegetInit(); //初始的总内存

long maxMemorySize = memoryUsagegetMax(); //最大可用内存

long usedMemorySize = memoryUsagegetUsed(); //已使用的内存

方式二:

Runtime rt = RuntimegetRuntime();

long totalMemorySize = rttotalMemory(); //初始的总内存

long maxMemorySiz = tmaxMemory(); //最大可用内存

long freeMemorySize = rtfreeMemory(); //当前可用内存

需要说明的是,这种方式获取的是整个jvm的内存使用情况,并不是某一个进程的内存使用情况,事实上,在java内部,可以使用RumtimegetRuntime()exec(${SHELL})来开启一个外部进程(这里${SHELL}代表一个可 *** 作系统的shell命令)。而运行Java程序整个jvm,对于 *** 作系统而言,也仅仅只是一个进程。也就是说,一个jvm就是一个进程,你通过java程序开启的进程都是外部进程,java内部目前还提供了一个destroy方法来销毁该进程,对于该进程的其它信息,都无法直接获取,这些信息的获取,显然需要本地化(Local)的实现。既然标准jdk库没有,就不可能再通过平台无关的代码来实现了。典型的做法就是使用前面第一种情况的方式,再启一个进程,执行shell命令来获取。

不过对于cpu使用时间,采用标准java代码倒是可以拿到。由于java的语法很啰嗦,举一个较完全的例子需要太多的代码,我这里就只写最关键的代码:

ThreadMXBean threadMXBean = ManagementFactorygetThreadMXBean();

① long currentCpuTime = threadMXBeangetCurrentThreadCpuTime(); //当前线程的cpu使用时间

long someThreadId = 709817L; //假定有某个线程的ID是709817

② long someThreadCpuTime = threadMXBeangetThreadCpuTime(someThreadId); //获取ID为someThreadId即709817的线程的cpu时间

基于上面的核心api,你可以把由java启动的外部进程放到一个单独的线程中执行,再用代码②的方式来获取该进程的cpu使用时间,也可以将外部进程放入到当前线程中执行,用① 的方式来获得进程的cpu使用时间。

CPU对于各个线程的调度是随机的(分时调度),而在Java中,JVM负责线程的调度,可更好地分配CPU的使用权。对于线程的调度一般有两种模式,分时调度和抢占式调度。分时调度是按照顺序平均分配;抢占调度是按照优先级来进行分配。

*** 作系统提供多任务功能,进程和线程都是任务,进程有独立的内存空间。多任务被 *** 作调度共享CPU,每个任务运行一个时间片,然后交出CPU,再由其他任务占用CPU。多任务又分为抢占式多任务和协作式多任务。

多任务解决的问题是什么?是多个任务对CPU的分时复用。

通常情况下任务的程序有和内存打交道和IO设备打交道,与内存相比,IO非常慢,如果任务长时间等待IO的就绪,对CPU资源是浪费的。也就是一个IO密集型任务的CPU利用率非常低,但是其他计算密集型的任务无法执行。

有了多任务, *** 作系统就可以对多个任务进行调度,每个任务执行一个时间片,再换队列中的下一个任务。在单CPU系统上就可以支持多个任务。

而Java的线程只不过是对 *** 作系统线程的封装。

多核CPU是指一个CPU有多个核心(每个核心还可以有多个超线程),CPU早期计算能力的增长是随着主频的增长而增长,但是主频上升到一定程度,功耗和散热都是无法逾越的,于是CPU计算能力的增长转变了思路,变为主频不高的有多个核心的CPU。

在只有一个核的CPU时代,程序员写的程序不需要修改,就可以通过换成更高主频的CPU而获得性能的提升。但是,在多核CPU时代,如果程序写的程序只有一个线程,换成2核,4核,8核的CPU,程序的性能无法获得增长,于是就要求程序员写多线程的程序,将计算问题分解到多个线程上解决,这样才能获得性能的提升。

回到你的问题,当多任务 *** 作系统运行在单CPU的计算机上,多个线程/进程是轮流按照时间片共享单个CPU的。当多任务 *** 作系统运行在对称对处理器/核的计算机上,多个进程会被调度到不同的核心上运行。

也就是说,5个线程跑在4个内核上,可能一个内核有两个线程,其他3个内核各有一个线程

以上就是关于一台Java服务器如何跑多少个线程全部的内容,包括:一台Java服务器如何跑多少个线程、java 如何获得一个进程的内存使用情况,cpu运行的时间、Java的多线程和CPU等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9641079.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存