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

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

相关推荐
杨荧3 小时前
【开源免费】基于Vue和SpringBoot的贸易行业crm系统(附论文)
前端·javascript·jvm·vue.js·spring boot·spring cloud·开源
东阳马生架构5 小时前
G1原理—1.G1回收器的分区机制
jvm
Chancezhou6 小时前
【JVM】总结篇之对象内存布局 执行引擎
jvm
豆浆两块钱15 小时前
【Java】JVM内存相关笔记
java·jvm·笔记
GentleDevin17 小时前
JVM生产环境常用参数配置及调优建议
jvm·性能调优
键盘上的蚂蚁-1 天前
Python 语言结合 Flask 框架来实现一个基础的代购商品管理
jvm·数据库·oracle
m0_748256781 天前
【SQL】掌握SQL查询技巧:数据分组与排序
java·jvm·sql
东阳马生架构1 天前
JVM实战—13.OOM的生产案例
jvm
安girl1 天前
JDK、JRE、JVM三者的关系、JDK8的新特性、JVM内存结构,堆栈的区别
java·jvm