Java内存区域

2/10/2017来源:ASP.NET技巧人气:349

根据《java 虚拟机规范(JavaSE7版)》的规定,Java虚拟机所管理的内存将会包括以下几个运行时数据区域。如下图(来自互联网)

这里写图片描述

运行时数据区域

Java虚拟机在执行Java程序的过程中会把它管理的内存划分为若干个不同的数据区域,这些区域都有它们的生命周期(创建和销毁时间)。

程序计数器

程序计数器PCR(PRogram Counter Register)是一块非常小的内存空间,我们可以理解为它是当前线程所执行的字节码的行号指示器(指针),字节码解析器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。 Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的。线程私有(也叫线程隔离)的概念: 每条线程都需要有一个独立的程序计数器,各个线程之间的计数器互不影响,独立存储的内存区域。

Java虚拟机栈

与程序计数器一样,Java虚拟机栈(Java Virtual Machine Stacks)也是线程私有的,它的生命周期与线程相同。我们通常说的栈内存(Stack)其实就是Java虚拟机栈。堆内存(Heep)其实就是Java堆。

本地方法栈

本地方法栈(Native Method Stack)与虚拟机栈所发挥的作用是非常类似的,他们的区别在于服务对象不同,Java虚拟机栈服务Java方法,本地方法栈服务本地方法。

Java堆

Java堆(Java Heep)是Java虚拟机所管理的内存中最大的一块,Java堆是被所有线程共享的。所有的对象实例以及数组都要在堆上分配。当然Java堆是垃圾收集器管理的主要区域。很多时候也被称为GC堆

方法区

方法区(Method Area)与Java堆一样,是线程共享的内存区域,方法区存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据

运行时常量池

运行时常量池(Runtime Constant Pool)是方法区的一部分,Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池(Constant Pool Table)用于存放编译器生成的各种字面量和符号的引用,这部分内容将在类加载后进入方法区的运行时常量池中存放。