JVM之运行时数据区域

JVM之运行时数据区域

概述:Java虚拟机在运行过程中会将它管理的内存划分为若干不同的数据区域,这些区域在JVM运行时都有各自的用途,创建和销毁时机,有的内存区域随着虚拟机进程的启动而存在,有些区域则依赖于用户进程的启动而启动,销毁而销毁。

必要性:理解JVM运行时数据区域有助于进行JVM性能优化,了解JVM常见的内存溢出的集中情况,以及对JVM性能进行优化。

运行时数据区域:根据Java JVM虚拟机规范的规定,Java 虚拟机所管理的内存包括以下几个区域,如图所示。

 JVM之运行时数据区域_第1张图片

 

1.程序计数器

当前线程所执行的字节码的行号指示器。Java虚拟机中的多线程通过线程轮流切换使用CPU资源,为保证线程切换后能恢复到正确的执行位置,每条线程都需要一个独立的程序计数器。

此区域是JVM规范中没有规定任何OutOfMenoryError的区域。

2.Java虚拟机栈

线程私有,Java虚拟机栈描述的是Java方法执行的内存模型,JVM中每个方法执行时都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接库等。

如果线程请求的深度大于虚拟机所允许的深度,将抛出StackOverflowError异常,如果该部分内存扩展时无法申请到足够的内存,则抛出OutOfMemoryError异常

3.本地方法栈

为虚拟机使用到的本地方法服务,同Java虚拟机栈。

4.Java

所有线程共享的内存区域,几乎所有对象的实例都是在这里进行分配,Java 堆是垃圾回收机制的主要区域。

如果Java堆中没有内存完成实例分配,并且堆也无法扩展时,将会抛出OutOfMenoryError错误。

5.方法区

各个线程共享,用于存储已被JVM加载的类信息,常量,静态变量等数据。

当方法区无法满足内存分配的需求时,将抛出OutOfMemoryError异常。

6.运行时常量池

属于方法区,用于存放编译期生成的各种字面量和符号引用,该部分内容将在类加载后进入方法区的运行时常量池中。

具有动态性,常见的String类的intern()方法。

当常量池无法在申请到内存时将抛出OutOfMenoryError错误。

7.直接内存

不属于JVM虚拟机运行时数据区的一部分,非JVM虚拟机规范中定义的内存区域。

当各个内存区域的总和大于物理内存的限制从而导致动态扩展时出现OutOfMenoryError异常。

 

 

 

你可能感兴趣的:(JVM)