entity framework 内存占用

weixin_37658304 2017-03-22 09:45:35
各位大佬,我开发用的ef6,现在出现一个严重的问题,查询时内存会增加,查询动作结束后,内存不会减少,重新查询,内存还会增加,现在我的系统占用20-40G内存,大佬们知道什么问题吗?虚心请教。
...全文
590 37 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
peng2739956 2017-03-23
  • 打赏
  • 举报
回复
用什么ORM都无所谓,重要的对这个ORM的熟悉程度,从抄代码到自己对着个ORM理解写高效代码 是需要一段时间的。所以各位也不用去贬低楼主,你们也都是这样过来的。何必呢
丰云 2017-03-22
  • 打赏
  • 举报
回复
一看这代码。。。。大量的反射。。。。大量的滥用。。。。看起来很高深,其实都是坑。。。。。 完全脱离了ef的初衷。。。。 如果我是你,直接要求重构,否则不接手这活。。。
weixin_37658304 2017-03-22
  • 打赏
  • 举报
回复
引用 5 楼 wq1234wq 的回复:
EF 上下文对象用完没有销毁吧,用了七八年不曾出现楼主的问题,数据库用了10多G内存倒是常有的事情。
每一次查询完,内存不会减少,再一次查询内存还是会增加,是不是哪里有什么设置,项目框架不是我搭的,我也不了解,求大佬解答。
weixin_37658304 2017-03-22
  • 打赏
  • 举报
回复




这是我的代码,各位大佬帮忙看下,真心求指教
weixin_37658304 2017-03-22
  • 打赏
  • 举报
回复
引用 7 楼 foren_whb 的回复:
代码不行,关ef什么事。。。。。 就像拿菜刀杀人,却给菜刀判刑一样。。。。。 不讲道理啊。。。。
我现在就是不知道问题出现在哪里,所以请教大佬,你别找事,
wq1234wq 2017-03-22
  • 打赏
  • 举报
回复
说实话,EF产生的SQL语句比我自己写的效率高的多,尤其是复杂的查询,觉得自己SQL还马马虎虎,和人家生成的一起profile一下,差了千倍,备受打击啊。
丰云 2017-03-22
  • 打赏
  • 举报
回复
ef刚出来,我就开始用了,这么多年了,也没出这种问题。。。。。。
丰云 2017-03-22
  • 打赏
  • 举报
回复
代码不行,关ef什么事。。。。。 就像拿菜刀杀人,却给菜刀判刑一样。。。。。 不讲道理啊。。。。
大然然 2017-03-22
  • 打赏
  • 举报
回复
所以我还是喜欢接近底层的ado.net
wq1234wq 2017-03-22
  • 打赏
  • 举报
回复
EF 上下文对象用完没有销毁吧,用了七八年不曾出现楼主的问题,数据库用了10多G内存倒是常有的事情。
正怒月神 版主 2017-03-22
  • 打赏
  • 举报
回复
也不一定是ef的问题。 根据你的描述,先调试看看
  • 打赏
  • 举报
回复
内存占用20-40G,确实是很“恐怖”的一件事情。 越是这样,越是说明你没有写测试用例去深入各种问题测试,就直接把程序上线了。
  • 打赏
  • 举报
回复
我不用 EF。我建议你首先检查设计了什么 static 变量,找到其使用过程。 可能你处处都用到 ef6,于是把编程造成的内存占用问题推给它。但是要知道它不是什么小公司随便推出的开源小框架,把问题推给它往往伤害不了它,所以重点是自己检查 bug、真正能够发现问题。
weixin_38011522 2017-03-22
  • 打赏
  • 举报
回复
entity framework就是这样的,随着应用服务器的硬件提升,EF在便捷、高效的基础上往往是吃硬件的
长空X 2017-03-22
  • 打赏
  • 举报
回复
引用 25 楼 foren_whb 的回复:
不要自以为是了,你那代码跟我写的完全不是一回事,也许你还没到能理解这些东西的程度,但我先要明确的告诉你这个概念!!!!
用EF做分页的话 思维是什么呀?有点没看懂上面的代码..
weixin_37658304 2017-03-22
  • 打赏
  • 举报
回复
引用 32 楼 wq1234wq 的回复:
按照foren_whb 的方式写,你那个_db肯定是声明成类成员了,foren_whb 的db上下文是在方法里,区别就是一个在栈上,一个在堆上,去看看这两个的区别,了解GC如何工作的。
好的,感谢两位大佬指教。
weixin_37658304 2017-03-22
  • 打赏
  • 举报
回复
引用 33 楼 u011785544 的回复:
如果时间紧就给你个治标不治本的办法 先用着 然后腾出时间寻找解决办法


[DllImport("kernel32.dll")]
public static extern bool SetProcessWorkingSetSize(IntPtr proc, int min, int max);

public static void Dispose()
{
        if (Environment.OSVersion.Platform == PlatformID.Win32NT)
        SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1);
}

自己检测一下内存的占用 超过了就调用一下这个方法 内存迅速下去
这个方法我用过了,会出现另外一个问题,就是跟重新发布一样登录需要很长时间。是不是跟ef启动有关
Veary 2017-03-22
  • 打赏
  • 举报
回复
如果时间紧就给你个治标不治本的办法 先用着 然后腾出时间寻找解决办法


[DllImport("kernel32.dll")]
public static extern bool SetProcessWorkingSetSize(IntPtr proc, int min, int max);

public static void Dispose()
{
        if (Environment.OSVersion.Platform == PlatformID.Win32NT)
        SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1);
}

自己检测一下内存的占用 超过了就调用一下这个方法 内存迅速下去
wq1234wq 2017-03-22
  • 打赏
  • 举报
回复
按照foren_whb 的方式写,你那个_db肯定是声明成类成员了,foren_whb 的db上下文是在方法里,区别就是一个在栈上,一个在堆上,去看看这两个的区别,了解GC如何工作的。
wq1234wq 2017-03-22
  • 打赏
  • 举报
回复
var list = db.Blogs.Include("Categories").Where(p => p.Status < 2); 不要使用Include ,要么做视图,时间紧请Join
加载更多回复(17)

62,243

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧