内存溢出原因(发现问题)

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

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应用将数据返回之后,这部分数据就可以在内存中被释放掉。

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

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

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

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

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

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

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

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

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

响应时间

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

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

                                                           拿蹦蹦开个玩笑哈哈哈~不要当真~~

  • 34
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值