JVM内存分区
图示
堆区(Heap)
堆区是Java虚拟机所管理的内存中最大的一块内存区域,也是被线程共享的内存区域,该内存区域存放对象以及数组(但不是所有的对象实例都在堆中)等。
方法区(Method Area)
方法区也称"永久代",它用于存储虚拟机加载的类信息、常量、静态变量,是各个线程共享的内存区域。
虚拟机栈(JVM Stack)
虚拟机栈描述的是方法执行的内存模型:每个方法被执行的时候都会创建一个"栈帧",栈帧用于存储局部变量表(包括参数)、操作栈、方法出口等信息。虚拟机栈为线程私有。
本地方法栈(Native Stack)
与虚拟机栈基本类似,区别在于虚拟机栈为虚拟机执行的方法服务,而本地方法栈则是为Native方法服务。本地方法栈为线程私有。
程序计数器(PC Register)
程序计数器是JVM内存区域中最小的一块区域,它是当前线程所执行的字节码的行号指示器,在虚拟机的模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、异常处理、线程恢复等基础功能都需要依赖计数器完成。
直接内存
直接内存并不是虚拟机内存的一部分,也不是Java虚拟机规范中定义的内存区域。jdk1.4中新加入的NIO,引入了通道与缓冲区的IO方式,它可以调用Native方法直接分配堆外内存,这个堆外内存就是直接内存,它不会影响到堆内存的大小。