java堆、栈、方法区内存溢出

1.java堆内存溢出
  java堆用于存储对象,只要不断的创建对象,并且保证GC Roots到对象的之间有可达路径来避免垃圾回收机制清楚这些对象,那么在对象数量达到最大堆容量限制后就会产生内存溢出异常。
2.栈内存溢出
  在单个线程下,无论是由于栈帧太大还是虚拟机栈容量太小,当内存无法分配的时候,虚拟机抛出的都是StackOverflowError异常。
  多线程下,不断建立线程会产生内存溢出,但这样的内存溢出和栈空间是否足够大并不存在任何联系。在这种情况下,为每个线程的栈分配的内存越大,反而越容易产生内存溢出。
3.方法区内存溢出
  HotSpot  jdk1.7之前字符串常量池是方法区的一部分,方法区叫做“永久代”,在1.7之前无限的创建对象就会造成内存溢出,提示信息:PermGen space
而是用jdk1.7之后,开始逐步去永久代,就不会产生内存溢出。

  方法区用于存放Class的相关信息,如类名、访问修饰符、常量池、字段描述、方法描述等,如果动态生成大量的Class文件,也会产生内存溢出。常见的场景还有:大量JSP或动态产生JSP文件的应用(JSP第一次运行时需要编译为java类)、基于OSGi的应用(即使是同一个类文件,被不同的类加载器加载也会视为不同的类)。

猜你喜欢

转载自kedamaomao.iteye.com/blog/2343099