zoukankan      html  css  js  c++  java
  • jvm的内存模型

    一、jdk1.7的堆内存模型

       

    1、Young 年轻区(代)

      Young区被划分为三部分,Eden区和两个大小严格相同的Survivor区,其中,Survivor区间中,某一时刻只有其中一个是被使用的,另外一个留做垃圾收集时复制对象用,在Eden区间变满的时候, GC就会将存活的对象移到空闲的Survivor区间中,根据JVM的策略,在经过几次垃圾收集后,任然存活于Survivor的对象将被移动到Tenured区间。

    2、Tenured 年老区

      Tenured区主要保存生命周期长的对象,一般是一些老的对象,当一些对象在Young复制转移一定的次数以后,对象就会被转移到Tenured区,一般如果系统中用了application级别的缓存,缓存中的对象往往会被转移到这一区间。

    3、Perm 永久区

      Perm代主要保存class,method,filed对象,这部份的空间一般不会溢出,除非一次性加载了很多的类,不过在涉及到热部署的应用服务器的时候,有时候会遇到java.lang.OutOfMemoryError : PermGen space 的错误,造成这个错误的很大原因就有可能是每次都重新部署,但是重新部署后,类的class没有被卸载掉,这样就造成了大量的class对象保存在了perm中,这种情况下,一般重新启动应用服务器可以解决问题。

    4、Virtual区

      最大内存和初始内存的差值,就是Virtual区。

    二、jdk1.8的堆内存模型

      

      由上图可以看出,jdk1.8的内存模型是由2部分组成,年轻代 + 年老代
    1、年轻代
      Eden + 2*Survivor
    2、年老代
      OldGen
    3、在jdk1.8中变化最大的Perm区,用Metaspace(元数据空间)进行了替换。
      需要特别说明的是:Metaspace所占用的内存空间不是在虚拟机内部,而是在本地内存空间中,这也是与1.7的永久代最大的区别所在。
      

    三、为什么要废弃1.7中的永久区

      官网给出了解释:http://openjdk.java.net/jeps/122
      
      现实使用中,由于永久代内存经常不够用或发生内存泄露,抛出异常java.lang.OutOfMemoryError: PermGen。
      基于此,将永久区废弃,而改用元空间,改为了使用本地内存空间

    四、通过jstat命令进行查看堆内存使用情况

      jstat命令可以查看堆内存各部分的使用量,以及加载类的数量。命令的格式如下:
        jstat [-命令选项] [vmid] [间隔时间/毫秒] [查询次数]

    1、查看class加载统计

    jstat -class 29720

      

      说明:
        Loaded:加载class的数量
        Bytes:所占用空间大小
        Unloaded:未加载数量
        Bytes:未加载占用空间
        Time:时间

    2、查看编译统计

    jstat -compiler 29720

      

      说明:
        Compiled:编译数量。
        Failed:失败数量
        Invalid:不可用数量
        Time:时间
        FailedType:失败类型
        FailedMethod:失败的方法

    3、垃圾回收统计

    jstat -gc 29720

       

      #也可以指定打印的间隔和次数,每1秒中打印一次,共打印5次
    jstat -gc 29720 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:垃圾回收消耗总时间
     
     
  • 相关阅读:
    NYOJ127 星际之门(一)【定理】
    JAVAWEB开发之JSTL标签库的使用、 自己定义EL函数、自己定义标签(带属性的、带标签体的)
    如何写一个不可变类
    保护性拷贝
    猴子搬香蕉问题
    阿里云服务器安装redis启动失败问题排查
    oauth2测试
    远程连接云服务器上的mysql失败问题解决
    SQLServer中将yyyy:MM:dd HH:mm:ss.sss转为yyyyMMddHHmmss
    Centos8 安装 MySQL
  • 原文地址:https://www.cnblogs.com/Zzzzn/p/12403428.html
Copyright © 2011-2022 走看看