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

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

相关推荐
Java知识库6 小时前
2025秋招后端突围:JVM核心面试题与高频考点深度解析
java·jvm·程序员·java面试·后端开发
康小庄16 小时前
AQS独占模式——资源获取和释放源码分析
java·开发语言·jvm·spring boot·spring·spring cloud·nio
码不停蹄的玄黓16 小时前
通关JUC:Java并发工具包从入门到精通 | 深度源码解析
java·jvm·spring boot·spring·spring cloud
YuTaoShao1 天前
Java八股文——JVM「内存模型篇」
java·开发语言·jvm
张哈大2 天前
【 java 虚拟机知识 第二篇 】
java·开发语言·jvm·笔记
YuTaoShao2 天前
Java八股文——JVM「垃圾回收篇」
java·开发语言·jvm
@泽栖2 天前
讲讲JVM的垃圾回收机制
java·jvm·面试·八股文
ManageEngine卓豪2 天前
如何有效监控JVM环境,保障应用性能
jvm·虚拟机监控·应用性能监控·java 虚拟机
重庆小透明2 天前
【从零开始学习JVM | 第六篇】运行时数据区
java·jvm·后端·学习
gadiaola2 天前
【JVM面试篇】高频八股汇总——类加载和类加载器
java·jvm·面试