JVM内存图
这是JVM给出的规范图,可以说是一个标准。
各个厂家对JVM的具体实现各有千秋。
我们熟知的Hotspot虚拟机将虚拟机栈和本地方法栈合而为一。
程序计数器
程序计数器是占用内存较小的一块内存空间,可看做一个正在执行字节码文件的行号解释器,
行号解释器的工作就是,通过改变它的值来执行下一条字节码指令,是程序控制流的指示器。
多线程是通过线程轮流切换,分配处理器执行时间来实现的,所以为了切换后能恢复到正确的位置,每条线程都需要一个程序计数器
方法区
存储已被虚拟机加载的类型信息,常量,静态变量,是JVM规范里面的概念是抽象的。
在1.6的时候,Hotspot开发团队考虑到虚拟机的发展,就有将放弃永久代改为本地内存来实现方法区的想法了。
1.7之前,方法区由永久代实现。1.7把常量池和静态变量放入堆中,此时方法区由堆和永久代共同实现。
1.8彻底放弃永久代,该用元空间。把1.7中还剩余的内容(主要是类型信息),全部移到元空间中,此时方法区由堆(常量池,静态变量)和元空间(类型信息)实现。
虚拟机栈
每个方法在执行的时候,都会创建一个栈帧,用于存储局部变量表,动态链接,操作数栈,方法出口等信息,每一个方法执行完毕,对应一个栈帧从入栈到出栈的过程。
堆
堆内存最大,堆是被线程共享,堆的目的就是存放对象。几乎所有的对象实例都在此分配。当然,随着优化技术的更新,某些数据也会被放在栈上等。分为新生代和老年代,老年代又分为伊甸园区和from区和to区,新老比例:1:2 伊甸园区:from:to:8:1:1