您的位置:

permgen space解决方法详解

一、什么是permgen space

PermGen(永久代)是JVM中的一个重要的内存区域。该内存区域主要用于存放静态文件,如class、method等,以及生命周期比较长的对象。这些对象一旦被加载到PermGen中,就不会被卸载,因此,如果应用程序使用频繁,或是其中存在大量的代码(如动态生成代码),就容易导致PermGen空间被占满甚至溢出。

二、PermGen溢出的原因

PermGen空间的大小是由JVM参数进行配置的,如果应用程序需要加载的类、方法或对象超过了该空间的上限,就会发生PermGen溢出。

以下几种情况会导致PermGen占用过高而造成溢出的问题:

1、应用程序大量使用反射技术,动态生成类的情况

2、应用程序大量使用自定义ClassLoader加载类的情况

3、应用程序使用第三方框架的时候,如果该框架使用自定义的ClassLoader就有可能造成PermGen泄漏

4、在应用程序启动的时候,如果JVM加载的class太多,也可能导致PermGen空间被占满

三、PermGen溢出的解决方法

1、调整JVM参数

-XX:PermSize=64m -XX:MaxPermSize=128m

通过设置该参数,可以调整JVM中PermGen空间的大小。PermSize参数指定初始的PermGen大小,MaxPermSize参数指定PermGen的最大大小。

2、使用CMS GC

与其他GC相比,CMS GC的特点在于它可以在最短的时间内完成垃圾回收,同时尽量避免长时间的暂停。这就意味着,在使用CMS GC的时候,应用程序的吞吐量能够保持比较稳定的状态。

-XX:+UseConcMarkSweepGC

通过该参数,可以开启CMS GC。

3、使用G1 GC

G1 GC是JDK 6u14及以上版本引入的垃圾回收器。它的特点在于可以将堆内存分成不同的区域进行管理,因此可以有效地避免Full GC的发生。同时,G1 GC还具有自适应的特性,可以根据应用程序的需求自动调整各种参数。

-XX:+UseG1GC

通过该参数,可以开启G1 GC。

4、解决动态代码生成的问题

如果应用程序使用了动态代码生成技术,就容易导致PermGen溢出。解决该问题的方法是尽可能减少动态代码生成的次数,或者是通过更加高效的代码生成方式来减轻PermGen空间的负担。

5、使用工具查看PermGen使用情况

JDK自带了一个工具jmap,可以查看PermGen空间的使用情况。使用该工具可以帮助我们更加清晰地了解应用程序的内存使用情况,从而进行相应的优化工作。

jmap -heap [pid]

通过该命令,可以查看指定pid的进程中PermGen的使用情况。

四、总结

PermGen空间是JVM中的一个重要的内存区域。由于生命周期较长的对象都会被放置在PermGen中,因此,当应用程序中使用的类、方法或对象超过了存储空间的上限时,就会导致PermGen溢出。通过调整JVM参数、使用不同的GC算法、尽可能减少动态代码生成的次数以及使用工具来查看PermGen使用情况,都可以有效地解决PermGen溢出的问题。