tomcat常见的内存溢出现象
tomcat内存溢出是经常见的事情。下面是理论知识(多数来自网上):
1.OutOfMemoryError: Java heap space
2.OutOfMemoryError: PermGen space
3.OutOfMemoryError: unable to create new native thread.
1.OutOfMemoryError: Java heap space
这个问题是堆内存溢出,只要增加堆内存的大小, 程序就能正常运行. 另外还有一些比较复杂的情况, 主要是由代码问题导致的:
超出预期的访问量/数据量。比如应用程序在查询数据库时,不注意SQL进行了全表扫描,查询出大量的数据,这样使得内存数据量急剧增加。 如果访问量突然飙升, 超过预期的阈值, 数据库查询的集合又得不到及时的释放也会引起内存占用过大、并触发 java.lang.OutOfMemoryError: Java heap space 错误。
内存泄露(Memory leak).。这也是一种经常出现的情形。由于代码中的某些错误, 导致系统占用的内存越来越多. 如果某个方法/某段代码存在内存泄漏的, 每执行一次, 就会(有更多的垃圾对象)占用更多的内存. 随着运行时间的推移, 泄漏的对象耗光了堆中的所有内存, 那么 java.lang.OutOfMemoryError: Java heap space 错误就爆发了。
2.OutOfMemoryError: PermGen space
PermGen space的全称是Permanent Generation space,是指内存的永久保存区域OutOfMemoryError: PermGen space从表面上看就是内存溢出,解决方法也一定是加大内存。这一部分用于存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域,它和和存放Instance的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS的话,就很可能出现PermGen space错误。
3.OutOfMemoryError: unable to create new native thread.
系统内存耗尽,无法为新线程分配内存,可能是某些线程一直处于等待。无法释放。
创建线程数超过了操作系统的限制