JVM的内存模型

1.jdk1.7的内存模型

JVM的内存模型_第1张图片

  • 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区。 

2.jdk1.8的内存模型

JVM的内存模型_第2张图片
 

在jdk1.8中变化大的Perm区,用Metaspace(元数据空间)进行了替换。
需要特别说明的是:Metaspace所占用的内存空间不是在虚拟机内部,而是在本地内存空间中(即服务器内存),这也是与1.7的永久代大的区别所在。

因此jdk1.8的内存模型如下:

JVM的内存模型_第3张图片

整个内存模型分为两块,一个是堆内存,一个是非堆内存。

堆内存又分为两块:年轻代 + 年老代。

               年轻代:Eden + 2*Survivor 

               年老代:OldGen 

非堆内存就是Metaspace,CodeCache主要存放相关字节码信息即class信息。ccs主要存放类的压缩指针。

为什么要废除1.7的永久代呢,官方网站也给出解释:移除永久代是为融合HotSpot JVM与 JRockit VM而做出的努力,因为JRockit没有永久代,不需要配置永久代。 

而且在实际使用中永久代内存经常不够用或发生内存泄露,爆出异常java.lang.OutOfMemoryError: PermGen。基于此,将永久区废弃,而改用元空间,改为了使用本地内存空间。 

3.jstat命令进行查看堆内存使用情况

命令的格式如下:
jstat [-命令选项] [vmid] [间隔时间/毫秒] [查询次数] 

JVM的内存模型_第4张图片

  • 查看class加载统计

​​​​​​​启动应用,使用jps命令查看启动应用的端口号。输入jstat -class [端口号]结果如下

JVM的内存模型_第5张图片

其中

Loaded:加载class的数量

Bytes:所占用空间大小

Unloaded:未加载数量

Bytes:未加载占用空间

Time:加载所需时间 

  • 查看编译情况

命令:jstat -compiler [端口号] 

说明:
          Compiled:编译数量。

          Failed:失败数量

          Invalid:不可用数量

          Time:编译时间

          FailedType:失败类型

          FailedMethod:失败的方法 

  • 查看垃圾回收统计

​​​​​​​命令:jstat -gc [端口号]

也可以指定打印的间隔和次数。

例如:每1秒中打印一次,共打印5次 。jstat -gc [端口号] 1000 10

JVM的内存模型_第6张图片

S0C:第一个Survivor区的大小(KB)

S1C:第二个Survivor区的大小(KB)

S0U:第一个Survivor区的使用大小(KB)

S1U:第二个Survivor区的使用大小(KB)

EC:Eden区的大小(KB)

EU:Eden区的使用大小(KB)

OC:Old区大小(KB)

OU:Old使用大小(KB)

MC:方法区大小(KB)

MU:方法区使用大小(KB)

CCSC:压缩类空间大小(KB)

CCSU:压缩类空间使用大小(KB)

YGC:年轻代垃圾回收次数

YGCT:年轻代垃圾回收消耗时间

FGC:老年代垃圾回收次数

FGCT:老年代垃圾回收消耗时间

GCT:垃圾回收消耗总时间 

你可能感兴趣的:(Java)