是发⽣在GC占⽤⼤量时间为释放很⼩空间的时候发⽣的,是⼀种保护机制。⼀般是因为堆太⼩,导致异常的原因:没有⾜够的内存。
Sun 官⽅对此的定义:超过98%的时间⽤来做GC并且回收了不到2%的堆内存时会抛出此异常。
使用VisualVm观察发现是在没有任何请求时,年轻代不断生成对象,但又不释放,对象不停地往老年代转移,发生内存泄露。
解决方法:
1、使用visualVM软件打开发生oom时的自动导出的文件*.hprof
2、VisualVM -> 文件 -> 选择hprof文件
3、显示的基本信息中有如下一段话:
导致 OutOfMemoryError 异常错误的线程: restarteMain
4、通过查询知道:
主函数这块被执行了两次。而且在控制台上显示的第二次的线程名为restartedMain
5、热部署的插件引起的,去掉以下依赖就好了
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>