JVM在运行java程序的时候会把管理的内存划分为若干个不一样的数据区域。java
用于存储已被JVM加载的类变量、常量、静态变量、即时编译器编译出的代码等。spa
(有人将方法区称为永久代是由于有一些虚拟机把GC分代手机扩展到方法区,使用永久代来管理方法区。这样垃圾收集器能够像管理堆同样管理这部份内存,不须要再专门为方法区编写内存管理代码,原则上讲实现虚拟机方法区属于实现细节,不该受规范约束,但使用永久代方法实现方法区,更容易遇到内存溢出的问题)线程
内存回收:这一区域的内存回收主要集中在常量池和对类型卸载。对象
Class文件中除了类的版本,字段、方法、接口等描述信息外,还有就是常量池,用于存放编译器生成的各类字面量和符号引用。这部分在类加载后放进运行时常量池中。接口
是虚拟机所管理内存的最大一块,惟一的目的就是存放对象实例,是垃圾收集器管理的主要区域。内存
JVM规定,Java堆能够处于物理上不连续的内存空间,只要逻辑上是连续的便可。编译器
描述Java方法执行的内存模式,每一个方法执行的同时会建立一个栈帧,用于存储局部变量表、操做数栈、动态连接、方法出口等信息,每一个方法从调用直至完成的过程当中都对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。虚拟机
能够看作当前线程所执行的字节码行号指令。经过改变这个计数器的值来选取下一条须要执行的字节码指令。内存管理
各个线程之间的计数器独立存储互不影响。编译
为虚拟机使用到的Native方法服务,与虚拟机栈发挥的功能相似。(有些虚拟机将本地方法栈和虚拟机栈合二为一)
并非虚拟机运行时数据区域的一部分,也不是JVM规范定义中得内存区域。也会出现OutOfMemoryError异常。
总结自《深刻理解JVM》