Java运行时内存区域的划分

Jvm 在运行的过程中内存的划分区域

    堆(Heap) 、栈(Stack) 、程序计数器(Program Counter Register)、方法区(Method Area)

1.堆

     存放目标对象和数组区域

     垃圾回收算法主要工作区域

     大部分Java虚拟机都会将此区域设置成动态不可扩展的

     Java堆可以不是物理上连续的内存空间,只要逻辑上连续即可

     堆空间不足会抛出 OutOfMemoryError

2.栈

   2.1 虚拟机栈

       描述本地方法在运行过程中需要存储的信息

       存储变量表 操作栈 动态链接 方法出口

       方法调用一次的过程,就是帧栈一次出栈和入栈的过程

       编译器存放的数据类型:八种基本数据类型,对象引用,returnAddress类型

       StackOverFlowError : 如果线程请求的资源深度大于虚拟机所允许的深度,此区域会抛出异常

       OutOfMemoryError:  在虚拟机会动态扩展的情况下,如果申请不到足够的内存,就会抛出OutOfMemoryError(大部分Java虚拟机都会支持动态扩展)

   2.2 本地方法栈

        本地方法栈只为虚拟机栈使用的Native 方法服务

        HotSpot虚拟机直接将此区域和虚拟机栈合并

        同虚拟机栈一样,此区域也会抛出StackOverFlow和OutOfMemoryError 异常

3.方法区

        各个线程共享的一块区域

        存放虚拟机加载的类信息,常量,静态变量,即时编译器编译后的的代码

        别名:永久代

        对这已区域的回收主要针对:常量池回收和对类型的卸载

        此区域也会抛出OutOfMemoryError

        运行时常量

4.程序计数器

        标记某个线程执行字节码指令行号,记录指令执行到哪了

        每个线程都有一个独立的程序计数器

参考资料:《深入Java虚拟机》

Java运行时内存区域的划分_第1张图片

你可能感兴趣的:(Java运行时内存区域的划分)