java的单进程多线程模式

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配置查看

  1. 查看有哪些flag选项

    jinfo -flags pid
  2. 查看jvm各个配置的值

    jinfo -flag ThreadStackSize pid

线程数量设置

  • 经验值:服务器线程数*2+1
  • 计算密集型的,则创建的线程数 = 处理器核心数
  • 如果io操作比较耗时,则根据具体情况调整线程数,此时线程数 = n*处理器核心数
  • 一般情况程序线程数等于cpu线程数的两到三倍就能很好的利用cpu了,过多的程序线程数不但不会提高性能,反而还会因为线程间的频繁切换而受影响,具体需要根据线程处理的业务考略,不断调整线程数个数,确定当前系统最优的线程数

    查看某个进程的线程栈设置大小
      jinfo -flag ThreadStackSize pid

进程/线程上下文切换会用掉你多少CPU?
Tools for Performance Analysis

相关文章
相关标签/搜索