服务器承载的线程数量计算分析的全过程详解

服务器在同一时间内,能够并行承载多少个线程?

线程在执行的时候需要占用服务器的哪些资源 - CPU、内存

一台服务器能够承载的线程数量由CPU还是由内存决定?
线程在CPU上是并行处理还是串行处理?—串行 - 线程在CPU上是轮询处理的 - CPU的处理速度决定了线程的执行速度,但是CPU的处理速度不能决定线程的数量
线程产生和执行都需要占用内存。n个线程可以在CPU上来轮询处理,但是n个线程是否可以轮询占用内存?—不能。线程即使处于阻塞状态,也是占用内存的,只是不占用CPU而已

一台服务器同一时间内能够承载的线程数量主要是由内存来决定

线程和内存结构的数量应对关系

Java中,将内存划分为了5块
Stack:栈内存。用于执行代码块(逻辑)的。变量是为了方便阅读和理解而在代码块执行过程中的附加产物。每一个线程独享一个栈内存
Heap:堆内存。用于存储对象的。所有线程共享一个堆内存
Method Area:方法区。用于存储类信息的。所有线程共享一个方法区
Native Stack:本地方法栈。用于执行本地方法。用native修饰但是没有方法体的方法,称之为本地方法。本地方法的方法体是用其他语言来实现的,绝大部分的本地方法是用C/C++来实现的,有少数的本地方法是用Python来实现的。每一个线程独享一个本地方法栈
Program Counter:PC计数器。对线程来进行计数的,决定线程要执行的下一个指令。PC计数器指向哪一个指令,那么CPU接下来就要执行哪一个指令。每一个线程独享一个PC计数器
*****从JDK1.8开始,方法区被取消,取而代之的是堆内存中的元空间和永久代

一台服务器能够承载的线程数量将会由栈内存、本地方法栈以及PC计数器的大小来决定
PC计数器非常小,只占几个字节大小,一般不超过4个字节 - 可以忽略不计
本地方法栈的大小不确定,要看底层实现语言以及逻辑所占的内存大小。小的话可能只有几KB,大的话甚至于会导致出现内存溢出 - OutOfMemoryError
栈内存在JDK1.8中规定,最小是128KB

一台8核的128G内存的服务器,在同一时间内,能够承载多个线程?

极端条件:忽略掉PC计数器以及本地方法栈大小,栈内存128KB来计算
内存标记为128G,实际内存在90%左右,即115.2GB
JVM规定,所有的栈内存之和一般超过实际内存的2/3 -> 115.2/3*2=76.8GB
76.8GB/128KB≈629146
实际过程中,线程的等待唤醒以及类的加载等基本操作都是使用的本地方法,这就导致本地方法栈无法忽略的,甚至于本地方法栈和栈内存大小基本一致

上述算出来的数字实际过程中需要进行折半,也就意味着一台128G的服务器,实际能够同时承载的线程数量一般不超过35W个

猜你喜欢

转载自blog.csdn.net/qq_41536934/article/details/113703011