Java虚拟机管理的内存包括以下几个运行时数据区域:
?
?
程序计数器是一块比较小的内存空间,是当前线程执行的字节码行号指示器。Java 多线程是通过线程轮流切换来实现的,所以每个线程都有一个自己独立的程序计数器,各个线程的程序计数器互补干扰。
Java虚拟机栈描述的是 Java 方法的执行模型:每个方法执行的时候都会创建一个帧栈用于存放局部变量表,操作栈,动态链接,方法出口等信息。一个方法的执行过程,就是这个方法对于帧栈的入栈出栈过程。
本地方法栈与Java 虚拟机栈功能相似。 Java 虚拟机栈储存 Java 方法执行的数据,本地方法栈储存 Native 方法执行数据。
堆是Java 虚拟机管理内存中最大的一块,也是垃圾回收经常光顾的地方。堆里存放的是对象的实例。
方法区域存放的是被虚拟机加载的类信息,常量,静态变量,即时编译后的代码等数据。Java 虚拟机规范中将它描述成堆的一部分。常量池是方法区域的一部分,里面存放编译期生成的各种字面量和符号引用。
另外,还有直接内存,它不是虚拟机运行时数据的一部分,也不是Java 虚拟机规范中定义的内存区域,但是这部分内存是会被频繁的使用的。
?