JVM之内存区域划分

jvm之内存区域划分

1.概述
作为Java开发人员,对虚拟机是要了解一下的。虚拟机的作用是自动内存管理,不像C++一样让程序员去维护一个对象的生命开始到生命的结束。Java把内存的控制权全部交给了虚拟机,如果一旦出现内存泄露和溢出,怎么解决BUG ,了解虚拟机是有必要的。

2.运行时的数据区域

JVM之内存区域划分_第1张图片
java虚拟机运行在操作系统的堆,Java程序运行在Java虚拟机上。上图绿色的区域是Java每一个线程私有的,白色区域是公有的。

3.程序计数器
这个跟CPU程序计数器PC的作用一样,就是记录指令的地址。每一条线程都有自己的独立程序计数器。如果正在执行Java方法,那么记录的是当前执行的指令地址,如果正在执行Native方法,则计数器为空。这个内存区域是唯一没有OutOfMemoeryError的区域。

4.Java虚拟机栈
这个存放的是局部变量表、操作数栈、动态链接、方法出口等信息。局部变量表存放的是基本数据类型(boolean、byte、long 、int、 short、 char、 double、float)和对象的引用。如果请求栈的深度大于虚拟机的深度,则抛出StackOverflowError异常(函数递归太深),如果是可以动态扩展大小,但是超出了内存就会抛出OutOfMemoryError异常。

5.Java堆
这个堆不是数据结构中的堆,是内存区域。这个区域存放的是Java对象,所有的对象和数组都在这个区域分配。这个区域通常是垃圾收集器主要光顾的区域。这个区域可像操作系统一样管理分页内存,可以物理不连续,逻辑连续就行。当堆无法扩展时也抛出OutOfMemoryError异常(对象太多)。

6.方法区
这个区域存放的是已被虚拟机加载的类信息、常量、静态变量、及时编译器编译后的代码等数据。当无法扩展时也抛出OutOfMemoryError异常。

7.本地方法栈
这个区域跟虚拟机栈发挥的作用类似,不过虚拟机栈运行Java方法,本地方法栈运行的是Native方法。跟虚拟机栈一样,抛出StackOverflowError异常、OutOfMemoryError异常。

8.运行时常量池
它是属于方法区的一部分存放的是编译期产生的各种字面量和符号引用。java不一定只有编译期才会产生常量,在运行期间也会产生常量。

你可能感兴趣的:(Java)