内存溢出(OutOfMemoryError,简称OOM)是让程序员头疼的问题,出现这种问题一般是内存空间要被用完了,没有足够的空间供程序使用。而在Java程序中,出现内存溢出的原因也有很多,常见的有堆内存溢出,直接内存溢出,永久区/元空间溢出。
堆溢出
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
复制代码
堆溢出这种是最常见的一种,在Java中堆是重要的一个空间,Java的大量对象都是直接在堆上分配的(参考内存分配)。当大量对象占据了堆空间而且都是强引用,使之始终无法被回收,当所有对象大小之和大于参数-Xmx
指定的值时,就会出现溢出了。
导致溢出的原因可能有很多,这里列举下常见的原因:
- 服务工程中的代码类太多,堆空间不够用,可能在启动的时候就会出现堆溢出的错误。
- 代码中存在循环或者死循环,产生过多的实体对象。
- 数据库查询的时候一次查询大量数据。
- 服务启动的参数-Xmx设置过小,也就是第一点。
例如我们不断往ArrayList中加入对象且无法回收导致出现堆溢出
/**
* 启动参数限制最大堆和最小堆:-Xms10m -Xmx10m
*/
public class Test2 {
public static void main(String[] args) {
ArrayList<byte[]> list = new ArrayList<>();
for (int i=0;i<10;i++){