JAVA内存区域

Java虚拟机在执行Java程序的过程中会把它所管理的内存化分为若干个不同的数据域。如下图所示,主要包括程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区。

 

1.1 程序计数器

程序计数器(Program Counter Register)是一块较小的内存空间,可以当成单签线程所执行的资码街的行号指示器。

作用:字码节解释器工作时可以通过改变这个计数器的值来选择吓一条需要执行的字码节指令;

在任何时候一个处理器只可以执行一条线程的指令,因此为了使得线程切换时处理器可以处理另外线程的正确指令,每个线程的程序计数器应该独立开来,互不影响。

1.2 Java虚拟机栈

Java虚拟机栈(Java Virtual Machine Stacks)也是线程私有的,它的生命周期与线程相同,为Java执行Java方法服务。

虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口(返回值)等等。

其中局部变量存放编译器可知的各种基本数据类型(booleanytecharshortfloatdouble)、对象引用(reference)、returnAddress类型。

1.3 本地方法栈

发挥的作用于虚拟机栈非常相似,为了虚拟机使用到的Native服务。

1.4 Java

一般而言,Java堆是Java虚拟机所管理的内存中最大的一块,是所有线程共享的一块内存区域,在虚拟机启动时创建。

此内存的唯一目的就是存放对象实例,几乎所有的对象实例都在这里存放。

Java堆可以处于物理上不连续的内存空间,只要逻辑上连续即可,既可以固定大小,也可以扩展内存。

1.5 方法区

是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即使编译器编译后的代码等数据。

方法区既可以固定大小,也可以扩展,甚至可以选用垃圾回收机制。

运行时常量池,用于存放编译期生成的各种字面量和符号引用。具备动态性,在运行期间也可以将新的常量放入池中。

原文地址:https://www.cnblogs.com/tianliang94/p/10398222.html