JVM存储区分为线程私有和线程共享两类。线程私有包括程序计数器、虚拟机栈和本地方法栈,分别用于记录指令地址、存储方法执行数据和支撑native方法调用;线程共享区包括堆和方法区,堆用于存放对象实例并分新生代、老年代,方法区存储类元信息,JDK 8后由元空间替代永久代,使用本地内存。

JVM中的存储区主要分为两种类型:线程私有区域和线程共享区域。这两种类型的内存区域在生命周期、访问权限和用途上都有明显区别。
线程私有区域
这类内存区域每个线程都有自己独立的实例,不会被其他线程访问,保证了数据的安全性。
- 程序计数器(Program Counter Register):记录当前线程执行的字节码指令地址,如果是本地方法则为空。它是唯一不会发生OutOfMemoryError的区域。
- 虚拟机栈(Java Virtual Machine Stacks):每个线程创建时都会创建一个栈,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每个方法调用对应一个栈帧,方法执行完成栈帧出栈。
- 本地方法栈(Native Method Stack):为JVM调用本地方法服务,功能与虚拟机栈类似,但针对的是native方法。
线程共享区域
这些区域被所有线程共同使用,通常在JVM启动时创建,随JVM退出而销毁。
Android编程之虚拟机Dalvik教程 pdf,介绍Dalvik与标准Java虚拟机的差别以及运行环境的区别、以及Dalvik的形势前景分析、Android中各种Java包的功能描述、相关文件类型、应用程序结构分析、Android Adb工具介绍等,这些知识对即将从事Android编程的初级朋友来说,是一个完美的前奏曲。
- 堆(Heap):存放对象实例和数组,是垃圾回收的主要区域。所有通过new创建的对象都分配在堆上,堆被划分为新生代和老年代,进一步细分为Eden区、Survivor区和Old区。
- 方法区(Method Area):存储类信息、常量、静态变量、即时编译器编译后的代码缓存等。在HotSpot JVM中,JDK 8之前称为“永久代”,之后被“元空间(Metaspace)”取代,元空间使用本地内存而不是堆内存。
基本上就这些。理解这两类存储区有助于分析内存溢出问题、优化程序性能以及深入掌握Java运行机制。不复杂但容易忽略细节。










