• 黑马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以后呢使用元空间相对充裕很多,并且垃圾回收机制也是由元空间自行管理了,就不会像永久代一样垃圾回收效率很低,经常由于垃圾回收效率低而导致内存溢出 

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

  • 相关阅读:
    微擎模块 有间解忧杂货店小程序2.14 修复用户头像昵称不显示的BUG
    自己手动构建nacos镜像实现非root用户启动
    用于一型糖尿病血糖调节的无模型iPID控制器
    Java/JDK 21正式发布!15个特性一览
    Qt http网络编程
    系列十一、阻塞队列
    Java网络编程
    数据分析之假设检验
    TypeScript(二)
    前端页面基础HTML、CSS、JS学习Day01
  • 原文地址:https://blog.csdn.net/dengfengling999/article/details/132817841