JVM设计者们之所以会选择将JVM内存结构划分为多个不同的内存区,是因为每个独立的内存区都有各自的用途,都会负责存储各自的数据类型。其中一些内存区的生命周期往往和JVM的生命周期保持一致,也就是说,会伴随者JVM的启动而创建,伴随着JVM的退出而销毁。而另一部分内存区则是与线程的生命周期保持一致,会伴随着线程的开始而创建,伴随着线程的消亡而销毁。尽管不同的内存区域存储的类型和生命周期有一定区别,却都拥有一个相同的本质,那就是存储程序的运行时数据。
JVM中的内存区可以根据受访问权限的不同定义为线程共享和线程私有两大类。
所谓线程共享指的是可以允许被所有的线程共享访问一类内存区,包括:
1、堆区;
2、方法去(永久代);
3、运行时常量池;
和线程共享内存区不同,线程私有内存区是不允许被所有线程共享访问的。线程私有的内存区是只允许被所属的独立线程进行访问的一类内存区,包括:
1、PC寄存器(程序计数器);
2、Java栈;
3、本地方法区;