• 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

  • 相关阅读:
    梦断代码第8章总结
    <<梦断代码>>读后感
    站立会议第四篇
    购买一批书的最低价格
    NABCD分析
    首尾相连的二维数组求最大字数组的和
    站立会议第三篇
    站立会议第二篇
    站立会议第一篇
    牛客算法周周练16D Rinne Loves Dynamic Graph(分层图最短路 + 堆优化dijkstra)
  • 原文地址:https://www.cnblogs.com/shengulong/p/11729847.html
Copyright © 2020-2023  润新知