关于内存溢出遇到的两种情况

Posted wholeworld

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于内存溢出遇到的两种情况相关的知识,希望对你有一定的参考价值。

1.处理数据的程序或者服务是x86架构的,容易出现内存溢出。

因为x86的进程,最多允许内存4g、在这4g中又有2g是操作系统等、所以当你查询的数据量非常大的时候,非常容易内存溢出。

2.多线程 容易导致内存溢出(溢出原理细节我还不清楚)

我查询mongo数据量,数据按地区分类,我查到A地区有70000条数据,B地区有60000条数据。我要将两地数据导出成excel,A地导出成功、B地导出报错:内存溢出。

为什么会出现这个异常呢?

这是因为在MongoDB中B地数据的字段比A地多很多。MongoDB对于.net的这个版本的驱动的find方法 底层用的是Dictionary 的Add来获取满足条件的数据集合。但是Dictionary是.net中线程不安全的,MongoDB的驱动可能使用了多线程查询数据、把数据插入集合中,由于B地区的数据一行特别长,插入还没结束,线程跑去插另外一条数据去了,这导致集合内部的一个计数器计算错误,记的数少了,但是插入的这个行数是不会变的,导致行数超越了集合边界,于是报内存溢出。

参考文献:https://blog.csdn.net/liweiblog/article/details/52329740

以上是关于关于内存溢出遇到的两种情况的主要内容,如果未能解决你的问题,请参考以下文章

有关内存溢出和内存泄漏的知识点

Android性能优化--关于内存溢出

windows下配置tomcat服务器的jvm内存大小的两种方式

spark内存溢出及其解决方案

spark 内存溢出处理

五种内存溢出案例总结:涵盖栈深度溢出永久代内存溢出本地方法栈溢出JVM栈内存溢出和堆溢出