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

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

相关推荐
乡野码圣5 小时前
【RK3588 Android12】RCU机制
java·jvm·数据库
m0_561359677 小时前
掌握Python魔法方法(Magic Methods)
jvm·数据库·python
2401_838472518 小时前
使用Python进行图像识别:CNN卷积神经网络实战
jvm·数据库·python
zhihuaba8 小时前
使用PyTorch构建你的第一个神经网络
jvm·数据库·python
u0109272718 小时前
Python Web爬虫入门:使用Requests和BeautifulSoup
jvm·数据库·python
91刘仁德9 小时前
c++类和对象(下)
c语言·jvm·c++·经验分享·笔记·算法
爱学习的阿磊10 小时前
Python上下文管理器(with语句)的原理与实践
jvm·数据库·python
m0_7369191010 小时前
Python面向对象编程(OOP)终极指南
jvm·数据库·python
2301_7657031411 小时前
开发一个简单的Python计算器
jvm·数据库·python
weisian15112 小时前
JVM--4-深入JVM堆内存:对象的诞生、成长与归宿
jvm·堆内存·老年代·新生代·内存问题排查