Loading... <div class="tip share">请注意,本文编写于 715 天前,最后修改于 715 天前,其中某些信息可能已经过时。</div> > jvm的内存模型在1.7和1.8有较大的区别,虽然本次学习会以1.8为例进行详细记录,但是我们也需要对1.7的内存模型有所了解,所以接下里,我们将先学习1.7再学习1.8的内存模型。 # JDK1.7内存模型  - 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内存模型  由上图可以看出,jdk1.8的内存模型是由2部分组成,年轻代 + 年老代。 年轻代:Eden + 2*Survivor 年老代:OldGen **在jdk1.8中变化最大的Perm区,用Metaspace(元数据空间)进行了替换。** 需要特别说明的是:**Metaspace所占用的内存空间不是在虚拟机内部,而是在本地内存空间中,这也是与1.7的永久代最大的区别所在。**  # 为什么要废弃1.7中的永久区? - This is part of the JRockit and Hotspot convergence effort. JRockit customers do not need to configure the permanent generation (since JRockit does not have a permanent generation) and are accustomed to not configuring the permanent generation. 移除永久代是为融合 HotSpot JVM与 JRockit VM 而做出的努力,因为 JRockit 没有永久代,不需要配置永久代。 在现实使用中,由于永久代内存经常不够用或发生内存泄露,爆出异常java.lang.OutOfMemoryError: PermGen。基于此,将永久区废弃,而改用元空间,改为了使用本地内存空间。 # 通过 jstat 查看堆内存使用情况 `jstat`命令可以查看堆内存各部分的使用量,以及加载类的数量。命令的格式如下: `jstat [-命令选项] [vmid]` [间隔时间/毫秒] [查询次数] ## 查看class加载统计 ```bash #先查看一下有关java的进程id jps jstat -class 6219 Loaded Bytes Unloaded Bytes Time 3273 7122.3 0 0.0 3.98 ``` 说明: - Loaded:加载class的数量 - Bytes:所占用空间大小 - Unloaded:未加载数量 - Bytes:未加载占用空间 - Time:时间 ## 查看编译统计 ```bash jstat -compiler 6219 Compiled Failed Invalid Time FailedType FailedMethod 2376 1 0 8.04 1 org/apache/tomcat/util/IntrospectionUtils setProperty ``` 说明: - Compiled:编译数量。 - Failed:失败数量 - Invalid:不可用数量 - Time:时间 - FailedType:失败类型 - FailedMethod:失败的方法 ## 垃圾回收统计 ```bash jstat -gc 6219 S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT 9216.0 8704.0 0.0 6127.3 62976.0 3560.4 33792.0 20434.9 23808.0 23196.1 2560.0 2361.6 7 1.078 1 0.244 1.323 #也可以指定打印的间隔和次数,每1秒中打印一次,共打印5次 jstat -gc 6219 1000 5 ``` 说明: - 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:垃圾回收消耗总时间 Last modification:August 30, 2020 © Allow specification reprint Support Appreciate the author AliPayWeChat Like 0 如果觉得我的文章对你有用,请随意赞赏