(系统剩余内存 - 最大堆容量Xmx - 最大方法区容量MaxPermSize)/ 最大栈空间Xss
4G的服务器单个进程可以开大概5000个线程。
操作系统分配给每个进程的内存大小是有限制的,比如32位的Windows是2G。因此操作系统对一个进程下的线程数量是有限制的,不能无限的增多。经验值:3000-5000左右
线程多了,就会有线程切换,带来性能开销。
jvm堆越大,系统创建的线程数量越小。
当-Xss的值越小,可生成线程数量越多。
//每个线程栈的大小
-Xss=128K
线程池大小
CPU 密集型应用,线程池大小设置为 N + 1
IO 密集型应用,线程池大小设置为 2N
线程池大小 = ((线程 IO time + 线程 CPU time )/线程 CPU time ) X CPU数目
corePoolSize:线程池的大小,当刚开始创建线程池时,线程数为0,当线程池中线程数量多于corePoolSize时会存于缓存队列
ArrayBlockingQueue:基于数组的先进先出队列,此队列创建时必须指定大小
LinkedBlockingQueue:基于链表的先进先出队列,如果创建时没有指定此队列大小,则默认为Integer.MAX_VALUE
synchronousQueue:这个队列比较特殊,它不会保存提交的任务,而是将直接新建一个线程来执行新来的任务
maxinumPoolSize:线程池容纳的最多线程数量
keepAliveTime:空闲线程的存活时间,一般情况下是当前线程线程数超过线程池大小,才会进行回收
unit:keepAliveTime的事件单位
threadFactory:通过这个参数你可以自定义如何创建线程,例如你可以给线程指定一个有意义的名字。
CallerRunsPolicy:如果任务被拒绝了,则由调用线程(提交任务的线程)直接执行此任务。
AbortPolicy:默认的拒绝策略,会 throws RejectedExecutionException。
DiscardPolicy:直接丢弃任务,没有任何异常抛出。
DiscardOldestPolicy:丢弃最老的任务,其实就是把最早进入工作队列的任务丢弃,然后把新任务加入到工作队列。
线程池创建线程,会判断当前线程数是否大于corePoolSize。
如果大于则存在缓存队列,缓冲队列存满后会继续创建线程直到maximumPoolSize,抛出拒绝的异常。
如果小于则创建线程,执行任务,执行完后会从缓存队列中取任务再执行