Java 内存溢出是常见问题, 现介绍内存溢出问题的几种解决办法, 不仅适用于 TongWeb,也适用所有的 Java 程序。
以下介绍的这些JVM参数都是加在TongWeb的startserver启动脚本中或JVM的启动参数中,本文不再介绍 shell 或批处理文件的写法
1. OutOfMemoryError: PermGen space 异常
这种问题常发生于 Oracle JDK 和 Open JDK 上,IBM JDK 没有此问题, 原因是程序中使用了大量的 jar 或 class,使 Java 虚拟机装载类的空间不够,与 PermSize 区有关。
这种问题的原因是 JVM 中创建的对象太多,在进行垃圾回收之间,虚拟机分配的到堆内存空间已经用满了。初步解决办法就是增加 JVM 中 Xms(初始堆大小)和 Xmx(最大堆大小)参数的大小,如:-Xms2048m –Xmx2048m,以及调整垃圾回收策略。
以下介绍的这些JVM参数都是加在TongWeb的startserver启动脚本中或JVM的启动参数中,本文不再介绍 shell 或批处理文件的写法
1. OutOfMemoryError: PermGen space 异常
这种问题常发生于 Oracle JDK 和 Open JDK 上,IBM JDK 没有此问题, 原因是程序中使用了大量的 jar 或 class,使 Java 虚拟机装载类的空间不够,与 PermSize 区有关。
解决这类问题就是增加 JVM 中的-XX:PermSize 和-XX:MaxPermSize 参数的大小,如:另外要注意清理应用中无用的 jar 和 class,在 TongWeb 上反复重部署应用后,记得重启下 TongWeb,以释放 PermSize 区内存。
这种情况是 Java 进程的线程数太多了,有可能是 TongWeb 的线程数设置过多,也有可能是应用起的线程数过多。通过 Oracle JDK 的 jstack 命令:jstack <PID> 打出线程堆栈可以看到线程的个数和状态。IBM JDK 可用 kill -3 <PID>命令打出,在进程的起始目录下生成 javacore 开头的线程分析文件。
此问题常见于JDK6上, 在JVM的启动参数中 增加-XX:-UseGCOverheadLimit 即可解决。
这种问题的原因是 JVM 中创建的对象太多,在进行垃圾回收之间,虚拟机分配的到堆内存空间已经用满了。初步解决办法就是增加 JVM 中 Xms(初始堆大小)和 Xmx(最大堆大小)参数的大小,如:-Xms2048m –Xmx2048m,以及调整垃圾回收策略。