解析Java内存区域
根据《Java虚拟机规范(第2版)》的规定,Java虚拟机所管理的内存将会包括以下几个运行时数据区域。如下图所示。
1.程序计数器
它主要有以下三个特点:
①程序计数器是一块较小的内存空间,它的作用可以看作是当前线程所执行的字节码的行号指示器;
②线程私有(每一个线程都有自己的程序计数器);
③如果线程执行的是Java方法,计数器记录的是正在执行的虚拟机字节码指令的地址,如果是本地方法,则计数器的值为空(Undefined);
2.Java虚拟机栈
它主要有以下几个特点:
①线程私有;
②描述了Java方法执行的内存模型:每个方法执行的时候,会同时创建一个栈帧(Stack Frame)用于存储局部变量、操作栈、动态连接、方法出口等消息。
③每个方法从被调用到执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程
3.本地方法栈
它主要有以下几个特点:
①线程私有;
②功能与虚拟机栈类似,与虚拟机栈不同的是虚拟机栈为虚拟机执行Java方法服务,而本地方法栈是为虚拟机使用到的本地方法(Native方法)服务。
4.Java堆
它主要有以下几个特点:
①线程共享;
②存放对象实例;
③垃圾收集器的主要区域,有时候被叫做“GC堆”;
5.方法区
它主要有以下几个特点:
①线程共享;
②用于存储已经被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据;