常见溢出

堆溢出

java.lang.OutOfMemoryError: Java heap space

原因

  • 创建对象过多,无法在 Java 堆中分配对象
  • 应用程序保存了无法被GC回收的对象
  • 应用程序过度使用 finalizer

栈溢出

  • 如果现场请求的栈深度大于虚拟机所允许的最大深度,将抛出StackOverflowError异常
    • 检查递归方法
  • 如果虚拟机在扩展栈时无法申请到足够的内存空间,可能会抛出OutOfMemoryError异常
    • 是否有死循环创建线程

原因

  • 在单个线程下,栈帧太大,或者虚拟机栈容量太小,内存无法分配
  • 不断地建立线程

方法区和运行时常量池溢出

原因

  • 使用CGLib生成了大量的代理类
  • JDK1.7之前过度使用String.intern( )
    • native方法:如果字符串常量池中存在一个String对象的字符串,那么直接返回常量池中的这个String对象; 否则,将此String对象包含的字符串放入常量池中,并且返回这个String对象的引用。

JDK 1.6 出现 OutOfMemoryError: PermGen space,1.7则不会