是什么
- 进程是操作系统进行资源分配和调度的基本单位。也就是说,操作系统在分配资源时把资源分配给进程
- 线程是CPU分配的基本单位
进程与线程的关系
一个进程至少有一个线程,进程中多个线程共享进程的资源。
如图所示,一个进程中有多个线程,多个线程共享进程的堆和方法区,每个线程都有自己的程序计数器和栈。
- 堆:存储new操作创建的对象
- 方法区:存储JVM加载的类、常量和静态变量信息
- 程序计数器:记录当前线程要执行的指令地址
- 虚拟机栈:存储线程的局部变量;存储线程的调用栈帧
举例说明
在Java中,启动main函数,其实就是启动一个JVM进程。main函数所在的线程就是该进程的一个线程,也称为主线程
思考
- 为什么程序计数器设计为线程私有的?
线程是占用CPU执行的基本单元,而CPU一般是使用时间片轮转方式让线程轮询占用的。所以,在当前线程CPU时间片使用完后,要让出CPU,等下次轮到自己的时候再次执行。程序计数器记录该线程让出CPU时的执行地址,等到再次分配到CPU的时间片时,进程可以直接从自己的程序计数器取出指定的地址继续运行。 - 程序计数器一定是存储下一条指令的地址吗? 不是的,当执行的是native方法时,程序计数器记录的是undefined地址,只有执行的是java代码时,程序计数器记录的才是下一条指令的地址