PS:本文参考《深入理解虚拟机一书》
虚拟机内存划分及各自作用
1.java虚拟机栈:用来存放局部变量表和对象的引用,虚拟机栈的单位是帧栈,每一个方法进栈后就是一个帧栈,方法执行完毕后会进行弹栈。java虚拟机栈是线程私有的,每一个线程都有自己的虚拟机栈。
2.本地方法栈:本地方法栈的作用和虚拟机栈一样,但是它是用来存放本地方法的。而且也是线程私有的。
3.程序计数器:它就像一个指针一样,用来记录代码执行到什么地方,比如在多线程中,一个线程在下次获得cpu的时候,会继续从上一次中断的位置继续执行,它是线程私有的。
4.方法区:存放类的信息,还有常量池,用来存放一些常量,比如String对象和静态常量,此外还有运行时常量池,和常量池不同的是,在运行阶段会从常量池copy数据,还可以动态添加数据,比如String的intern()方法。它线程共享的。
5.堆内存:用来存放对象,是发生GC的主要区域,方法区也会发生那个GC,栈中对象的引用存放的就是堆中对象的内存地址。它是线程共享的。
从网上找个图方便记忆: