JVM内存有一些按不同标准划分的概念,这里来理清一下。
一、首先java虚拟机规范定义了java运行时数据区在概念上应该有的分区,这是抽象概念不对应也不限制物理上的具体实现,不同的虚拟机可以有不同的实现,但是在抽象上必须要有这些区。
二、说完了逻辑概念,再说虚拟机实现,在实现虚拟机的时候,考虑垃圾回收效率,将JVM内存划分为三块:元数据区,老年代,新生代;注意这里的分代概念和运行时数据区是两个不同层次和标准的概念,是两套概念。
使用jvisualvm.exe安装Visual GC插件后可以查看到如下各代使用情况,从左到右是:元数据区,老年代,新生代;新生代包含Eden(伊甸园)、S0(0号幸存区)、S1(1号幸存区);
1.新生代:Eden+S0+S1
2.老年代:OldGen
3.永久代(方法区的实现) : PermGen----->替换为Metaspace(本地内存中)
java运行时内存按抽象逻辑和内存回收实现上划分了两套概念,他们之间可以有一定的对应关系,但不是确定的,jdk8就将运行时常量池从永久代移除了。