• 黑马JVM总结(五)


    (1)方法区

    它是所有java虚拟机 线程共享的区,存储着跟类的结构相关的信息,类的成员变量,方法数据,成员方法,构造器方法,特殊方法(类的构造器)

    方法区在虚拟机启动时被创建,方法区逻辑上是堆的组成部分,但是不同的JVM厂商实现是不一样的:Oracle的HotSport虚拟机在jdk8以前,方法区的实现叫做永久代,这个永久代就是使用了堆的一部分最为方法区,1.8以后呢把永久代移出了,换了一个实现,叫做 元空间,元空间呢就不是用的堆的内存它用的是本地内存操作系统的内存

    方法区内存发现内存不足了,也会让虚拟机抛出内存溢出

    HotSport虚拟机结构图:1.6使用堆的一部分作为元空间,1.8使用本地系统作为元空间

    (2)方法区_内存溢出1

    方法区存储类的数据,类没有多少怎么会导致内存溢出呢?

    1.8方法区的实现换成了元空间的实现,它默认情况下使用的是系统内存,没有设置它的上限,所以运行这个代码不会出现方法区的内存溢出

    需要加一个虚拟机参数,把最大的元空间大小设置小一些:这样才能看出云空间内存溢出的问题

    演示jdk1.6的,1.6的方法区的实现方法区叫做永久代

    设置一下永久代的大小: 

     

    (3)方法区_内存溢出2

    在实际过程中我们动态产生class,并加载这些类的场景是非常多的:

    Spring和mybatis都会用到cgllib:

    spring用cglib来生成一写代理类,代理类是spring   AOP的核心,mybatis也用到cglib用cglib产生mapper接口的实现类

    cglib的底层是:

    ClassWritert继承ClassVisitor:它是asm包中提供的类,完成动态生成类的字节码

    它里面也有这个类: 

     

     所以我们用Spring和mybatis的时候经常会产生大量的在运行期间生成的类,容易产生永久代的内存溢出的,1.8以后呢使用元空间相对充裕很多,并且垃圾回收机制也是由元空间自行管理了,就不会像永久代一样垃圾回收效率很低,经常由于垃圾回收效率低而导致内存溢出 

    遇到这种问题,我们要看看是否是框架使用的不合理产生太多的类,导致的内存溢出

  • 相关阅读:
    了解C语言中的atoi函数和模拟实现
    安卓开发——安卓界面布局笔记
    3.【刷爆LeetCode】找出字符串中第一个只出现一次的字符(多方法、多思路)
    如何获取mysql数据库中所有数据类型
    <三>使用类模板实现STL Vector
    描述符——配置描述符
    Java基础知识—Arrays工具类
    微信小程序 request合法域名 中设置WebSocket的wss/ws报错 该域名协议头非法 问题解决
    【tcl 脚本学习-- tcl 脚本常用命令介绍】
    23种设计模式之分类总结
  • 原文地址:https://blog.csdn.net/dengfengling999/article/details/132817841