博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JVM+Tomcat+Dubbo+Rabbit MQ线程关系,阿里P7需要掌握!
阅读量:2199 次
发布时间:2019-05-03

本文共 3472 字,大约阅读时间需要 11 分钟。

目录:

一、基础概念
二、进程和线程关系(进程和线程都是CPU工作时间段的描述)
1、进程概念
2、线程概念
3、进程和线程区别(资源管理方式不同)
4、进程和线程的优缺点
5、进程和线程的关系
三、它们的线程数关系(java应用)
1、存在形式和之间的关系( jvm ←→ tomcat < dubbo , mq client > ←→ mq server )
2、JVM线程大小分配原则
1)、线程数量的影响因素
2)、如何确定线程池大小
3)、如何解决线程数分配不合理的问题

最新2020整理收集的一线互联网公司面试真题(都整理成文档),有很多干货,包含netty,spring,线程,spring cloud等详细讲解,也有详细的学习规划图,面试题整理等,我感觉在面试这块讲的非常清楚:获取面试资料只需: 暗号:CSDN在这里插入图片描述

一、基础概念

1、JVM:java虚拟机

2、Tomcat:轻量级的web服务(HTTP服务)
3、Dubbo:RPC服务的实现(dubbo协议是netty-socket套接字(TCP/IP的封装)进行通信)
4、Rabbit mq:消息队列服务(基于AMQP协议)

二、进程和线程关系(进程和线程都是CPU工作时间段的描述)

1、进程概念

具有一定独立功能的程序关于某个数据集合上的一次运行活动,它是操作系统进行资源分配和调度的一个独立单位。
2、线程概念
1)、线程(Thread)是进程的一个实体,是CPU调度和分派的基本单位,比进程更小的能独立运行的基本单位。
2)、基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他线程共享进程所拥有的全部资源。
3、进程和线程区别(资源管理方式不同)
主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。
1)、一个程序至少有一个进程,一个进程至少有一个线程。(隶属关系不同)
2)、线程的划分尺度小于进程,使得多线程程序的并发性高。(大小不同)
3)、进程在执行过程中拥有独立的内存单元,而多个线程共享内存。(内存使用方式不同)
4)、每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,由应用程序提供多个线程执行控制。(执行方式不同)
4、进程和线程的优缺点
线程执行开销小,但不利于资源的管理和保护,而进程正相反。同时,进程可以跨机器迁移(在KVM虚拟化平台上实现虚拟机的跨机迁移),而线程不能。
5、进程和线程的关系
线程是属于进程的,线程运行在进程空间内,同一进程所产生的线程共享同一内存空间,当进程退出时该进程所产生的线程都会被强制退出并清除。

三、它们的线程数关系(java应用)

1、存在形式和之间的关系( jvm ←→ tomcat < dubbo , mq client > ←→ mq server )

1)、JVM:java虚拟机,属于一个进程。
日志标志:2018-12-21 16:45:20,148 [pool-29298-thread-1] DEBUG c.w.d.d.m.V.getTimeoutTasks(自定义jdk线程池)

2)、Tomcat:web服务,当tomcat启动时,进程管理器开启一个javaw进程,即:一个tomcat对应一个jvm。

日志标志:2018-12-21 16:48:46,348 [http-apr-0.0.0.0-8680-exec-2] DEBUG c.w.h.d.m.U.selectByPrimaryKey(tomcat线程池,该线程池主要处理HTTP请求)

3)、Dubbo:以线程方式存在

日志标志:2018-12-21 16:53:00,056 [DubboServerHandler-192.168.172.53:20890-thread-292] DEBUG c.w.p.d.m.U.countByExample (自定义jdk线程池)

4)、Rabbit MQ:MQ client以线程形式存在,MQ server以进程形式存在。

MQ client日志标志:2018-12-21 16:56:35,932 [SimpleAsyncTaskExecutor-1] INFO c.w.s.whale.config.ds(自定义jdk线程池)

2、JVM线程大小分配原则

1)、线程数量的影响因素
对于一个JVM实例到底能开多少个线程?其影响有以下几方面:
-Xms: 初始化Java堆的大小。
-Xmx: 最大Java堆大小
-Xss:每个线程的堆栈大小
系统限制: 系统最大可开线程数

不考虑系统限制:创建的线程数量达到31842个时系统中无法创建任何线程

在这里插入图片描述

上面测试结果可以看出增大堆内存(-Xms,-Xmx)会减少可创建的线程数量,增大线程栈内存(-Xss,32位系统中此参数值最小为60K)也会减少可创建的线程数量。

结合系统限制:

线程数量31842的限制是是由系统可以生成的最大线程数量决定的:/proc/sys/kernel/threads-max,可其默认值是32080。

修改其值为10000:echo 10000 > /proc/sys/kernel/threads-max,修改后的测试结果如下:

在这里插入图片描述

是不是意味着可以配置尽量多的线程?再做修改:echo 1000000 > /proc/sys/kernel/threads-max,修改后的测试结果如下:

在这里插入图片描述

发现线程数量在达到32279以后,不再增长。查了一下,64位Linux系统可创建的最大pid数是32768,这个数值可以通过/proc/sys/kernel/pid_max来做修改(修改方法同threads-max),但是在64系统下这个值只能改小,无法更大。在threads-max一定的情况下,修改pid_max对应的测试结果如下:

在这里插入图片描述

结论:影响Java线程数量的因素如下:

Java虚拟机:-Xms、-Xmx、-Xss

操作系统限制:

/proc/sys/kernel/pid_max(系统已用的线程或进程数)
/proc/sys/kernel/thread-max(系统可生成最大线程数)
max_user_process(ulimit -u)(用户最大进程数)
/proc/sys/vm/max_map_count(进程最大线程数)

2)、如何确定线程池大小

应用分类:(N 代表 CPU 个数)
CPU 密集型应用,线程池大小设置为 N + 1 (应用计算密集)
IO 密集型应用,线程池大小设置为 2N (读写磁盘较密集)
估算公式如下:线程池大小 = ((线程 IO time + 线程 CPU time )/线程 CPU time ) CPU数目

解释:通过公式得出需要3个具体数值

请求所消耗的时间 (线程 IO time + 线程 CPU time)
请求计算时间(线程 CPU time):请求总耗时 - CPU IO time
CPU 数目:查看cat /proc/cpuinfo| grep “processor”| wc -l
结论:JVM的线程栈内存越大,那么能创建的线程数量越少,越容易发生java.lang.OutOfMemoryError: unable to create new native thread。

3)、如何解决线程数分配不合理的问题

如果程序中有bug,导致创建大量不需要的线程或者线程没有及时回收,那么必须解决这个bug,修改参数是不能解决问题的。
如果程序确实需要大量的线程,现有的设置不能达到要求,那么可以通过修改MaxProcessMemory,JVMMemory,ThreadStackSize这三个因素,来增加能创建的线程数:
MaxProcessMemory 使用64位操作系统
JVMMemory 减少JVMMemory分配
ThreadStackSize 减小单个线程的栈大小

最后:

最新2020整理收集的一线互联网公司面试真题(都整理成文档),有很多干货,包含netty,spring,线程,spring cloud等详细讲解,也有详细的学习规划图,面试题整理等,我感觉在面试这块讲的非常清楚:获取面试资料只需: 暗号:CSDN在这里插入图片描述

转载地址:http://nehub.baihongyu.com/

你可能感兴趣的文章
【LEETCODE】53-Maximum Subarray
查看>>
【LEETCODE】215-Kth Largest Element in an Array
查看>>
【LEETCODE】241-Different Ways to Add Parentheses
查看>>
【LEETCODE】312-Burst Balloons
查看>>
【LEETCODE】232-Implement Queue using Stacks
查看>>
【LEETCODE】225-Implement Stack using Queues
查看>>
【LEETCODE】155-Min Stack
查看>>
【LEETCODE】20-Valid Parentheses
查看>>
【LEETCODE】290-Word Pattern
查看>>
【LEETCODE】36-Valid Sudoku
查看>>
【LEETCODE】205-Isomorphic Strings
查看>>
【LEETCODE】204-Count Primes
查看>>
【LEETCODE】228-Summary Ranges
查看>>
【LEETCODE】27-Remove Element
查看>>
【LEETCODE】66-Plus One
查看>>
【LEETCODE】26-Remove Duplicates from Sorted Array
查看>>
【LEETCODE】118-Pascal's Triangle
查看>>
【LEETCODE】119-Pascal's Triangle II
查看>>
【LEETCODE】88-Merge Sorted Array
查看>>
【LEETCODE】19-Remove Nth Node From End of List
查看>>