JVM内存模型是指JVM运行时所涉及到的内存区域规范,可以划分为以下六个部分:
HotSpot想把垃圾收集器的分代设计扩展至方法区,用永久代来实现方法区,这样就可以垃圾收集器能够像管理堆那样来管理方法区,但其他虚拟机实现并没有采用这样的观点,因为这会导致更容易出现OOM,后来由于Oracle收购了BEA,准备融合HotSpot和JRockit时,发现两者对方法区的实现差异太大,于是从JDK6开始准备放弃永久代的概念,逐步采用本地内存来实现方法区,直到JDK8才完全废弃了永久代,改用本地内存实现的元空间来替代
局部变量表:以槽(slot)的形式存储了编译期可知的①基本数据类型(byte、short、int、long、float、double、boolean、char);②引用类型(可能是一个指向对象起始地址的引用指针,也可能是指向一个代表对象的句柄或者其他与对象关联的地址);③returnAddress类型(指向了一条字节码指令的地址)。其中64位的long和double占用两个slot,其余占用一个slot ↩︎
运行时常量池:存放的是编译期生成的各种字面量与符号引用 ↩︎
直接内存:不是虚拟机运行时数据区的一部分,也不是虚拟机规范中定义的内存区域,而是JDK4引入的NIO中的一种基于通道与缓冲区的I/O方式关联的内存区域 ↩︎