JVM的内存区域里,有一块区域叫做永久代,JDK 1.8以后都叫做Metaspace,这块内存区域就是用来存放系统里的各种类的信息的,包括JDK自身内置的一些类的信息。
在一个JVM中,Metaspace区域的大小是固定的,比如512MB。
那么一旦JVM不停地加载类,加载了很多很多的类,然后Metaspace区域放满了,就会触发Full GC,Full GC会带着一块 进行Old GC就是回收老年代的,也会带着回收年轻代的Young GC。
当然,Full GC的时候,必然会尝试回收Metaspace区域中的类
比如这个类的类加载器先要被回收,比如这个类的所有对象实例都要被回收,等等。
所以一旦你的Metaspace区域满了,未必能回收掉里面很多的类,而且jvm还不停的往进加载其他类,那么直接就内存溢出了。
第一种原因,在上线系统的时候对Metaspace区域直接用默认的参数,默认的Metaspace区域可能才几十MB而已,此时对于一个稍微大型一点的系统,因为他自己有很多类,还依赖了很多外 部的jar包有有很多的类,几十MB的Metaspace很容易就不够了。
第二种原因:很多人写系统的时候会用cglib之类的技术动态生成一些类,一旦代码中没有控制好,导致生成的类过于多的 时候,就很容易把Metaspace给塞满,进而引发内存溢出
方法递归
如果您发现该资源为电子书等存在侵权的资源或对该资源描述不正确等,可点击“私信”按钮向作者进行反馈;如作者无回复可进行平台仲裁,我们会在第一时间进行处理!
添加我为好友,拉您入交流群!
请使用微信扫一扫!