我们先来复习一下什么是内存溢出?

Java中的内存溢出(Memory Overflow)通常指的是Java虚拟机(JVM)在运行时耗尽了可用内存资源,无法再分配足够的内存来满足程序的需求。内存溢出错误通常以OutOfMemoryError异常的形式抛出

内存溢出的原因有很多种:

一、代码中的内存泄露

  1. equals()和hashCode():不正确的equals()和hashCode()实现导致内存泄露
  2. 内部类引用外部类:非静态类的内部类和匿名内部类的错误使用导致内存泄露
  3. ThreadLocal的使用:由于线程池中的线程不被回收导致的ThreadLocal内存泄露
  4. String的intern方法:由于JDK6中的字符串常量位于永久代,intern被大量调用并保存产生的内存泄露
  5. 通过静态字段保存对象:大量的数据在静态变量中被引用,但是不再使用,成为了内存泄露
  6. 资源没有正常关闭:由于资源没有调用close方法正常关闭,导致的内存溢出

上面提到的这6仲原因其实在测试环境上很容易被发现,只要在测试环境中进行压力测试,这些问题就很容易被暴露出来。

二、并发请求问题

并发请求问题指的是用户通过发送请求向java应用获取数据,正常情况下java应用将数据返回之后,这部分数据就可以在内存中被释放掉。

spring boot 集成Arthas 排查内存溢出_内存溢出

spring boot 集成Arthas 排查内存溢出_内存泄露_02

并发请求问题指的是用户通过发送请求向Java应用获取数据,正常情况下Java应用将数据返回之后,这部分数据就可以在内存中被释放掉。但是由于用户的并发请求量有可能很大,同时处理数据的时间很长,导致大量的数据存在于内存中,最终超过了内存的上限,导致内存溢出。这类问题的处理思路和内存泄漏类似,首先要定位到对象产生的根源。

一般有三种情况会造成内存溢出:

一般springBoot应用,同一时间的最大量是有限的,默认情况下tomcat的线程池中的线程最多只有200个,所以同一时间最多只能处理两百个请求

1、同时并发的请求量比较大,比如说达到了200个

2、每一个请求,内存中加载的数据比较多,比如说一个用户请求了几千条,几万条数据

3、每一个请求处理的时间比较长      

spring boot 集成Arthas 排查内存溢出_数据_03

我们可以通过Apache JMeter这个工具来进行并发测,发现内存溢出问题。

Apache JMeter是一款开源的测试软件,使用java语言编写,最初是为了测试Web程序,目前已经发展成支持数据库、消息队列、邮件协议等不同类型内容的测试工具。

Apache JMeter支持插件扩展,生成多样化的测试结果。

spring boot 集成Arthas 排查内存溢出_内存泄露_04

spring boot 集成Arthas 排查内存溢出_内存溢出_05

响应时间

这篇文章是接着上文来继续阐述的,希望你们看完之后,会对内存溢出的原因以及那些地方会出现内存泄露有所了解。

后续会持续更新如何来诊断内存泄露问题,感谢大家的支持!!

                                                           

spring boot 集成Arthas 排查内存溢出_数据_06