天天看点

JVM-内存区域

        发现自己老了,好多东西开始慢慢忘却,

JVM-内存区域

,而且学多少忘多少,趁现在还记得一点,赶紧记下来,如果得到各位读者的补充或指正,不胜感激。

        先画个简易图,看起来清晰明了

JVM-内存区域

        其中深色的区域是线程共享数据区,浅色的是线程隔离数据区。

        1. Java堆

            Java堆是用来存放Java对象实例的内存区域,所有的对象实例以及数组都在堆这分配,而且它也是JVM管理的内存中最大的一块,也是所有线程共享的内存数据区,因为这对象实例的存放区域,所有该区域也是垃圾收集器工作的主要区域,故又名“GC堆”。

            还有就是在回收数据的时候常说的新生代和老生代也是指的这一区域,因为收集器采用的是分代收集算法,所以该区域也可划分为新生代和老生代。

        2. 方法区

            方法区也是线程共享的内存区域,它存储的是虚拟机加载的类信息、静态变量、常量等数据。

            另外方法区被还包含一部分,即运行时常量池,类文件在加载后,编译期生成的各种符号引用、字面量(字面量就是表达源代码中的固定值)。

        3. 虚拟机栈

           虚拟机栈是用来描述Java方法的内存模型,为虚拟机执行Java方法提供服务,每个方法在执行的同时会创建一个栈帧用来存储局部变量表、操作数栈、动态链接等。

        4. 本地方法栈

            本地方法栈是为虚拟机执行Native方法(Java方法调用非Java方法)服务的。

        5. 程序计数器

            程序计数器是用来记录每个线程具体执行位置的,当线程不停切换的时候,通过程序计数器,线程能回到正确的执行位置,每一个线程都有自己的程序计数器,它实际记录的是正在执行的虚拟机字节码指令的地址。

       补充:在虚拟机栈中,当线程请求的栈深度大于虚拟机运行的深度时,抛出StackOverflowError;

                                  当虚拟机栈可动态扩展,但是扩展时无法申请到足够的内存时,抛出OutOfMemoryError。