java是单进程多线程模型,多线程依然可以充分利用多核(core)/多处理器(cpu)
-
单个cpu线程在同一时刻只能执行单一指令,也就是一个线程
-
单个线程同时只能在单个cpu线程中执行
-
Java中的所有线程在JVM进程中,CPU调度的是进程中的线程
-
Java多线程并不是由于cpu线程数为多个才称为多线程(单个核的单个cpu不使用超线程,仍然可以实现Java的多线程,只是所有的线程都跑在OS的单个线程里),当Java线程数大于cpu线程数,操作系统使用时间片轮转(RR)调度算法,频繁的进行上下文切换,以便并发执行其他线程
-
默认情况下,Java中每创建一个线程,操作系统会分配1M的栈空间
-
cpu执行Java程序,其根本是执行java代码编译后的操作系统可以识别的指令,cpu执行一条指令的时间是ns级别的(1.6G的cpu执行一条指令,大概需要0.6ns),而cpu上下文切换则需要2万个CPU时间周期
/proc/sys/kernel/thread-max 系统可以生成最大线程数量 /proc/sys/kernel/pid_max 增大,线程数量增大,pid_max有最高值,超过之后不再改变,而且32,64位也不一样
jvm配置查看
-
查看有哪些flag选项
jinfo -flags pid
-
查看jvm各个配置的值
jinfo -flag ThreadStackSize pid
线程数量设置
-
经验值:服务器线程数*2+1
-
计算密集型的,则创建的线程数 = 处理器核心数
-
如果io操作比较耗时,则根据具体情况调整线程数,此时线程数 = n*处理器核心数
-
一般情况程序线程数等于cpu线程数的两到三倍就能很好的利用cpu了,过多的程序线程数不但不会提高性能,反而还会因为线程间的频繁切换而受影响,具体需要根据线程处理的业务考略,不断调整线程数个数,确定当前系统最优的线程数
查看某个进程的线程栈设置大小 jinfo -flag ThreadStackSize pid