关于JVM内存的线程共享和非线程共享

大多数 JVM 将内存区域划分为 方法区、堆、虚拟机栈、本地方法栈 、程序计数器,其中方法区和堆是线程共享的 ,虚拟机栈、本地方法栈 、程序计数器是非线程共享的。为什么分为线程共享和非线程共享的呢?

首先我们熟悉一下一个一般性的 Java 程序的工作过程。一个 Java 源程序文件,会被编译为字节码文件(以 class 为扩展名),每个java程序都需要运行在自己的JVM上,然后告知 JVM 程序的运行入口,再被 JVM 通过字节码解释器加载运行。那么程序开始运行后,都是如何涉及到各内存区域的呢?

概括地说来,JVM初始运行的时候都会分配好方法区和堆 ,而JVM 每遇到一个线程,就为其分配一个程序计数器 、虚拟机栈和本地方法栈),当线程终止时,三者(虚拟机栈,本地方法栈和程序计数器)所占用的内存空间也会被释放掉。这也是为什么把内存区域分为线程共享和非线程共享的原因,非线程共享的那三个区域的生命周期与所属线程相同,而线程共享的区域与JAVA程序运行的生命周期相同,所以这也是系统垃圾回收的场所只发生在线程共享的区域(实际上对大部分虚拟机来说知发生在堆上)的原因。

你可能感兴趣的:(关于JVM内存的线程共享和非线程共享)