JVM内存结构

JVM内存划分

JVM的内存结构主要分为五个部分:程序计数器、虚拟机栈、本地方法栈、堆、方法区。其中前三个部分是线程私有的,后两个部分是线程共享的。

 

程序计数器(Program Counter Register)

作用:指示当前线程的执行位置。(是一块较小的内存空间)

在并发的情况下,多个线程在一个处理器上交替运行。为了线程切换后能恢复到正确的执行位置,每个线程都需要有一个独立的程序计数器,各线程之间的计数器互不影响,独立存储。

 

虚拟机栈(JVM Stacks)

作用:描述Java方法执行的内存模型。

一个栈帧存储着局部变量表、操作栈、动态链接、方法出口等信息。栈帧随着方法的进入和退出做压栈和弹栈操作。

Java通过逃逸分析技术,可以分析出哪些对象只在当前方法中使用,直接在栈中为其分配内存,这些对象的生命周期就和栈帧一样,在栈中实现了自动的内存清理,从而减轻了GC的负担。

 

本地方法栈(Native Method Stacks)

作用:与虚拟机栈相似,区别在于:本地方法栈是为虚拟机使用到的Native方法服务的。

虚拟机规范中对本地方法栈中的方法使用的语言、使用方式与数据结构没有强制规定,虚拟机可以自由地实现它。

 

堆(Heap)

作用:存放对象。(是一块较大的内存空间)

堆内存是所有线程共享的,几乎所有的对象内存都在这里分配。

这里也是GC管理的主要区域,如果采用分代算法,堆内存还可以分为:Young区和Old区,其中Young区还可以细分为Eden区、Survivor(To、From)区,比例为8:1:1。

 

方法区(Method Area)

作用:存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

方法区也是所有线程共享的,它也被称为永久代。

 

posted @ 2020-09-03 14:25  昆梧  阅读(215)  评论(0)    收藏  举报