1.今天线上爆出了 java.lang.OutOfMemoryError: PermGen space
当时吓尿了,又没发包怎么突然报永久代内存溢出,临时先加大了永久代内存,将启动参数改为:
-XX:PermSize=128m为 -XX:PermSize=256m
启动异常消失。
2.留了一台机器jvm参数为之前的,来观察问题。用 jstat命令查看发现惊人一幕(jstat命令详用: https://blog.csdn.net/LuoZheng4698729/article/details/79443853)
不得了占了99.07%了,后来发现代码用到了扫描包,并调用了Class.forName() 将相关类都加载了进来,到达了永久代内存临界点,程序运行过程中如果在要加载常量和其它动态类,就没有内存了,导致报了线上内存溢出。
3.PermGen(永久代)
绝大部分 Java 程序员应该都见过 "java.lang.OutOfMemoryError: PermGen space "这个异常。这里的 “PermGen space”其实指的就是方法区。不过方法区和“PermGen space”又有着本质的区别。前者是 JVM 的规范,而后者则是 JVM 规范的一种实现,并且只有 HotSpot 才有 “PermGen space”,而对于其他类型的虚拟机,如 JRockit(Oracle)、J9(IBM) 并没有“PermGen space”。由于方法区主要存储类的相关信息,所以对于动态生成类的情况比较容易出现永久代的内存溢出。
完结!