面试的时候说到了线程池,能够复用线程,减少线程创建和销毁的开销,会占用CPU资源,面试官追问为什么线程的创建和销毁会占用CPU资源。
什么是线程
首先了解一下,什么是线程:是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。 这里可以扩展讲解一下进程:进程是程序在某个数据集合上的一次运行活动,也是操作系统进行资源分配和保护的基本单位。
内存消耗
对操作系统来说,创建一个线程的代价是十分昂贵的, 需要给它分配内存、列入调度,同时在线程切换的时候还要执行内存换页,CPU 的缓存被清空,切换回来的时候还要重新从内存中读取信息,破坏了数据的局部性。【分配内存、列入调度、内存换页、清空缓存和重新读取】 Java线程的线程栈区别于堆,它是不受Java程序控制的,只受系统资源限制。默认一个线程的线程栈大小是1M,别小看这1M的空间,如果每个用户请求都新建线程的话,1024个用户光线程就占用了1个G的内存,如果系统比较大的话,一下子系统资源就不够用了,最后程序就崩溃了。 【创建一个线程默认需要消耗1M的内存,如果每个用户请求都创建一个线程,那么1024个用户就是1G了,并发量一大就扛不住了】