深入理解JVM(一):什么是JVM?什么是JVM内存模型?( 四 )


深入理解JVM(一):什么是JVM?什么是JVM内存模型?
本文插图
3.5 本地方法栈
? 本地方法栈(Native Method Stacks)与虚拟机栈所发挥的作用是非常相似的 , 其区别只是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务 , 而本地方法栈则是为虚拟机使用到的本地(Native)方法服务 。
3.6 Java堆区
? Java堆是被所有线程共享的一块内存区域 , 在虚拟机启动时创建 。 此内存区域的唯一目的就是存放对象实例 , Java世界里“几乎”所有的对象实例都在这里分配内存 。
需要注意的是 , 《Java虚拟机规范》并没有对堆进行细致的划分 , 所以对于堆的讲解要基于具体的虚拟机 , 我们以使用最多的HotSpot虚拟机为例进行讲解 。
Java堆是垃圾收集器管理的内存区域 , 因此它也被称作“GC堆” , 这就是我们做JVM调优的重点区域部分 。
jdk1.7中堆内存的划分
深入理解JVM(一):什么是JVM?什么是JVM内存模型?
本文插图
Young 年轻区(代)Young区被划分为三部分 , Eden区和两个大小严格相同的Survivor区 , 其中 , Survivor区间中 , 某一时刻只有其中一个是被使用的 , 另外一个留做垃圾收集时复制对象用 , 在Eden区间变满的时候 , GC就会将存活的对象移到空闲的Survivor区间中 , 根据JVM的策略 , 在经过几次垃圾收集后 , 任然存活于Survivor的对象将被移动到Tenured区间 。
Tenured 年老区Tenured区主要保存生命周期长的对象 , 一般是一些老的对象 , 当一些对象在Young复制转移一定的次数以后 , 对象就会被转移到Tenured区 , 一般如果系统中用了application级别的缓存 , 缓存中的对象往往会被转移到这一区间 。
Perm 永久区Perm代主要保存class,method,filed对象 , 这部份的空间一般不会溢出 , 除非一次性加载了很多的类 , 不过在涉及到热部署的应用服务器的时候 , 有时候会遇到java.lang. OutOfMemoryError : PermGen space 的误 , 造成这个错误的很大原因就有可能是每次都重新部署 , 但是重新部署后 , 类的class没有被卸载掉 , 这样就造成了大量的class对象保存在了perm中 , 这种情况下 , 一般重新启动应用服务器可以解决问题 。
Virtual区:最大内存和初始内存的差值 , 就是Virtual区 。
jdk1.8中堆内存的划分
深入理解JVM(一):什么是JVM?什么是JVM内存模型?
本文插图
由上图可以看出 , jdk1.8的内存模型是由2部分组成 , 年轻代+ 年老代 。 年轻代:Eden + 2*Survivor年老代:OldGen在jdk1.8中变化最大的Perm区 , 用Metaspace(元数据空间)进行了替换 。 需要特别说明的是:Metaspace所占用的内存空间不是在虚拟机内部 , 而是在本地内存空间中 , 这也是与1.7的永久代最大的区别所在 。