JVM运行时数据区内存分布

java运行时的数据区,主要包括五部分

1.方法区
2.java虚拟机栈
3.本地方法栈
4.堆
5.程序计数器

具体分布如下图所示
JVM运行时数据区内存分布

各内存介绍如下

程序计数器

在java中有多线程概念,当a线程抢占到cpu时,此时正常执行且时间片到,此时b线程抢占到cpu,如此反复当下次a线程抢占到cpu时需要知道上次执行到哪了,这时程序计数器的作用就凸显出来:记录当前代码执行的行数。程序计数器是内存中唯一一个不存在OutOfMemoryError的

java虚拟机栈

每个方法在执行时都会创建对应的栈针,方法开始执行则创建栈针且作入栈操作,方法执行完,出栈操作。栈针中存储:局部变量表(存储局部变量)、操作连接(对象的引用)、操作数栈、方法的出口(return 的值),如果线程请求的栈的深度大于虚拟机所允许的则抛出*Error(比如递归操作,没有出口就会出现)

本地方法栈

什么是本地方法?即有native关键字的方法。和虚拟机栈类似,在方法执行时也会创建栈针,方法的执行与结束也就是栈针的入栈和出栈操作。

Java堆

java堆一块相对来说比较大的内存用来存储java对象。java堆内存是线程共享的,java堆可以分为新生代和老年代,其中新生代又可以分为(Eden Space、From Space、To Space),java堆是垃圾回收机制主要管理的区域所以又叫GC堆。

方法区

是线程共享的一块区域,用于存储已被虚拟机加载的类的信息,常量,静态变量,及时编译的代码数据。类信息主要包括:版本号,方法,实现接口等。HotSpot用永久代来实现方法区,而JRockit和IBM则没有永久代之分。永久代并不是不会被回收,这个区域的回收主要针对常量池的回收和类型的卸载,该区无法满足分配会抛出OutOfMemoryError。