运行时数据区有五个部分:本地方法栈、虚拟机栈、程序计数器、堆和方法区。
Java虚拟机定义了若干程序运行期间会使用到的运行时数据区,其中有一些会随着虚拟机(对应一个进程)的启动而创建,随着虚拟机的退出而销毁。另外一些则是与线程一一对应的,这些与线程对应的数据区会随着线程开始和结束而创建和销毁。
▶每个线程各自拥有:程序计数器、虚拟机栈、本地方法栈
▶线程间共享:堆、方法区(堆外内存)【永久代或元空间、代码缓存】
堆空间和方法区是共用的,所以涉及线程安全问题。JVM优化重点优化堆空间也包括方法区。
一个JVM实例对应一个Runtim实例,相当于一个运行时数据区。(每个JVM只有一个Runtime实例)
线程是一个程序里的运行单元。JVM允许一个应用有多个线程并行执行。
在Hotspot VM里,每个线程都与操作系统的本地线程直接映射。当一个Java线程准备好执行以后(程序计数器、栈结构、缓存分配、本地存储的准备工作),此时一个操作系统的本地线程也同时创建。Java线程执行终止后,本地线程也会回收。
操作系统负责所有线程的安排调度到任何一个可用的CPU上。一旦本地线程初始化成,它就会调用Java线程中的run()
方法,如果执行run()
方法过程中出现了未捕获的异常,会导致Java线程终止,本地线程来决定JVM到底要不要终止(判断当前线程是不是最后一个非守护线程,如果是则退出JVM)。