Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >从静态对象中包含的C#字典释放内存

从静态对象中包含的C#字典释放内存
EN

Stack Overflow用户
提问于 2013-02-22 10:55:26
回答 3查看 13K关注 0票数 17

我在使用WCF web服务时遇到了一些问题(一些转储、内存泄漏等)。我运行了一个有用的工具(ANTS Memory Profiles)。

只是为了找出,即使处理结束(我运行了一个特定的测试,然后停止),第2代仍然是web服务内存的25%。我跟踪了这个内存,发现我有一个充满(null,null)项的字典对象,带有-1哈希码。

web服务的工作流意味着,在特定的处理过程中,会添加项目,然后从字典中删除这些项目(只需简单的AddRemove)。没什么大不了的。但似乎在删除所有项后,字典中充满了(null,null) KeyValuePair。实际上,它们占据了很大一部分内存,最终发生溢出,相应的强制应用程序池回收和DW20.exe获得了它可以获得的所有CPU周期。

字典实际上是Dictionary<SomeKeyType, IEnumerable<KeyValuePair<SomeOtherKeyType, SomeCustomType>>> (System.OutOfMemoryException because of Large Dictionary),所以我已经检查了是否有某种引用保存了一些东西。

字典包含在一个静态对象中(通过处理使它可以被不同的处理线程访问),所以从这个问题和更多的问题(Do static members ever get garbage collected?)中,我理解了为什么字典在第二代。但这也是导致这些(null,null)的原因?即使我从字典中删除条目,内存中也总会有东西被占用吗?

这不是像这个问题Deallocate memory from large data structures in C#中那样的速度问题。似乎内存永远不会被回收。

我可以做些什么来从字典中实际删除条目,而不是仅仅用(null,null)对填充它?还有什么我需要结帐的吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-02-22 12:26:12

字典将条目存储在哈希表中。对此,内部使用了一个数组。由于哈希表的工作方式,此数组必须始终大于实际存储的项数(至少大30% )。微软使用72%的负载因子,即至少28%的数组将是空的(请参阅An Extensive Examination of Data Structures Using C# 2.0,特别是The System.Collections.Hashtable ClassThe System.Collections.Generic.Dictionary Class),因此null/null条目只能表示此可用空间。

如果数组太小,它将自动增长;但是,当项被移除时,数组不会缩小,但在插入新项时,应重用将释放的空间。

如果您可以控制此字典,您可以尝试重新创建它,以缩小它:

代码语言:javascript
运行
AI代码解释
复制
theDict = new Dictionary<TKey, IEnumerable<KeyValuePair<TKey2, TVal>>>(theDict);

但问题可能来自实际的(非空)条目。您的字典是静态的,因此垃圾收集器永远不会自动回收它,除非您为它分配另一个字典或null (theDict = new ...theDict = null)。这只适用于字典本身,它是静态的,而不是它的条目。只要其他地方存在对已删除条目的引用,它们就会持续存在。GC将回收任何不能再通过引用访问的对象(更早或更晚)。无论这个对象是否被声明为静态,都没有区别。对象本身不是静态的,只是它们的引用。

正如@RobertTausig友好地指出的那样,自从.NET Core2.1以来就有了新的Dictionary.TrimExcess(),这是你真正想要的,但当时还不存在。

票数 15
EN

Stack Overflow用户

发布于 2013-02-22 12:08:23

看起来你需要定期回收字典中的空间。您可以通过创建一个新的new Dictionary<a,b>(oldDict)来做到这一点。请确保以线程安全的方式执行此操作。

何时执行此操作?无论是在计时器的滴答声中(60秒?)或者发生特定数量的写入时(100k?)(你需要保留一个修改计数器)。

票数 5
EN

Stack Overflow用户

发布于 2013-08-27 10:23:26

一种解决方案是在静态字典上调用Clear()方法。这样,对字典的引用将保持可用,但包含的对象将被释放。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15022528

复制
相关文章
python3-字典中包含字典
# Auther: Aaron Fan #定义字典及内容 av_catalog = {    "欧美":{        "www.youporn.com": ["很多免费的,世界最大的","质量一般"],        "www.pornhub.com": ["很多免费的,也很大","质量比yourporn高点"],        "letmedothistoyou.com": ["多是自拍,高质量图片很多","资源不多,更新慢"],        "x-art.com":["质量很高,真的
py3study
2020/01/03
1.6K0
C# 快速释放内存的大数组
本文告诉大家如何使用 Marshal 做出可以快速释放内存的大数组。 最近在做 3D ,需要不断申请一段大内存数组,然后就释放他,但是 C# 对于大内存不是立刻释放,所以就存在一定的性能问题。 在博客园看到了一位大神使用 Marshal 做出快速申请的大数组,于是我就学他的方法来弄一个。本文告诉大家这个类是如何使用。
林德熙
2022/08/04
2K0
C# 快速释放内存的大数组
本文告诉大家如何使用 Marshal 做出可以快速释放内存的大数组。 最近在做 3D ,需要不断申请一段大内存数组,然后就释放他,但是 C# 对于大内存不是立刻释放,所以就存在一定的性能问题。 在博客园看到了一位大神使用 Marshal 做出快速申请的大数组,于是我就学他的方法来弄一个。本文告诉大家这个类是如何使用。
林德熙
2018/09/19
3K0
C# 快速释放内存的大数组
从JVM内存管理的角度谈谈静态方法和静态属性 和 java对象引用与JVM自动内存管理
试着从JVM的内存管理原理的角度来谈一下静态方法和静态属性的问题,不对的地方请指正。 (joezheng123.javaeye.com/blog/264695)
IT工作者
2022/05/09
9180
【C++】动态内存管理 ④ ( 对象的动态创建和释放引申思考 | 基础数据类型 内存分析 | malloc 分配内存 delete 释放 | new 分配内存 free 释放内存 )
malloc 和 free 是 C 语言 stdlib 标准库中的函数 , 用于 分配 和 回收 堆内存 ;
韩曙亮
2023/10/15
4410
【C++】动态内存管理 ④ ( 对象的动态创建和释放引申思考 | 基础数据类型 内存分析 | malloc 分配内存 delete 释放 | new 分配内存 free 释放内存 )
iOS从timer释放问题看内存管理
在iOS的开发中,如果使用NSTimer做定时器,一定要在合适的时机销毁这个定时器,不然可能导致内存得不到释放。原因就是循环引用。
清墨
2019/04/01
1.7K0
【C++】动态内存管理 ③ ( C++ 对象的动态创建和释放 | new 运算符 为类对象 分配内存 | delete 运算符 释放对象内存 )
首先 , 定义一个类 Student , 再为其定义一个有参的构造函数 , 和 析构函数 ;
韩曙亮
2023/10/15
3880
【C++】动态内存管理 ③ ( C++ 对象的动态创建和释放 | new 运算符 为类对象 分配内存 | delete 运算符 释放对象内存 )
Python - 从字典列表中删除字典
字典是python的一个非常常用的功能,用于根据用户需要在其中存储数据。另一个典型的过程涉及编辑或操作此数据。要成为一名高效且快速的程序员,您必须弄清楚如何从字典列表中删除字典。有许多技术可以从词典列表中删除字典,本文将介绍这些技术。
很酷的站长
2023/08/11
4460
Python - 从字典列表中删除字典
DirectByteBuffer内存释放
网络编程为避免频繁的在用户空间与内核空间拷贝数据,通常会直接从内核空间中申请内存,存放数据,在Java中,把内核空间的内存称之为直接内存,nio包中的ByteBuffer的allocateDirect方法,就是申请直接内存
JavaEdge
2021/12/07
3.3K0
DirectByteBuffer内存释放
iframe内存释放
Ext 核心开发人员Jack的回答是,TabPanelItem在关闭时并不会对自定义到tab中的元素做特殊处理,这部分工作必须在控件外来完成。另一方面, 相关资料称IE在iframe元素的回收方面存在着bug,在通常情况下应该将该元素的src属性值修改为”abort:blank”,并手工将其从 DOM树上移除,然后把脚本中引用它的变量置空并调用CollectGarbage()就可以避免iframe不能正常回收所造成的内存泄露。
河岸飞流
2019/09/11
5.2K0
【C++】动态内存管理 ⑤ ( 基础数据类型数组 内存分析 | 类对象 内存分析 | malloc 分配内存 delete 释放 | new 分配内存 free 释放内存 )
使用 malloc 函数 , 为 基础数据类型数组 分配内存 , 是可以使用 delete 操作符 释放该内存的 ;
韩曙亮
2023/10/15
2840
【C++】动态内存管理 ⑤ ( 基础数据类型数组 内存分析 | 类对象 内存分析 | malloc 分配内存 delete 释放 | new 分配内存 free 释放内存 )
python中更新字典对象
最近用python做了一个小工具,涉及到如下的字典操作,特做笔记如下: 1. 用update方法更新字典: 用字典的update方法,这时候传递给update的必须是一个字典.
qsjs
2020/06/09
1.5K0
centos7释放内存|yum清理缓存与释放内存
腾讯云服务器内存占用过高,安装的是centos7系统,准备对centos7释放内存,发现使用yum清理缓存与释放内存非常的方便,先使用free -m命令来查看centos7系统剩余了多少内存,准备清理掉,如下:
拓荒者
2019/03/16
9.8K0
c#中的静态本地方法
在 C# 8 中微软增加了静态本地方法,这种类型的方法无法获取和修改任何本地变量和实例成员。下面我们来看一下这种方法的具体用法。 首先我们来看一下普通的方法:
喵叔
2020/09/08
6480
C# CLR 聊聊对象的内存布局 一个空对象占用多少内存
在 C# 中的对象大概可以分为三个不同的类型,包括值类型、引用类型和其他类型。本文主要讨论的是引用类型对内存空间的占用情况。在讨论开始之前我想问问大家,一个空的对象会占用多少内存空间?当然这个问题本身就有问题,因为没有区分栈空间与堆空间的内存空间。其实小伙伴会发现这不是一个好回答的问题,因为似乎没有一个可以认为标准的标准答案。请让我为你详细聊聊对象的内存布局
林德熙
2022/08/12
9390
C# CLR 聊聊对象的内存布局 一个空对象占用多少内存
Mongodb 定时释放内存
对于主要是写入的数据库,mongodb内存占满之后写入效率会变得不稳定 这个时候,你需要释放内存(可试用db.runCommand({closeAllDatabases:1}) )实现 下面的c#代码可以用来定时释放内存,使用的时候注意把路径换成你服务器的路径,另外就是修改下释放频率 Technorati 标签: mongodb class Program { static void Main(string[] args) { while (t
JadePeng
2018/03/12
5.3K0
centos释放无用内存
centos中发现自己的进程消耗内存极少,但是系统的空闲内存确实没了,其实是CentOS为了提高效率,把部分使用过的文件缓存到了内存里。这样的话如果不需要这样的文件性能,可以直接释放来缓解内存压力。 检测命令: top 内存查看 shift+m 排序 解决: sync echo 3 > /proc/sys/vm/drop_caches 再用top检测即可
似水的流年
2019/12/07
3.4K0
如何释放Python占用的内存?
在调用数据时,经常遇到内存火箭上涨的情况,而且一些变量不使用了,但是依旧占着内存,大有在其位不谋其政的意味,因此专门学习了下,并做了些实验,记录之,若不想多看,仅仅想释放内存,直接跳转到5.2和5.3即可。
自学气象人
2023/06/20
2.2K0
如何释放Python占用的内存?
类静态指针的申请和释放
     如果类有一个静态成员指针变量,在进程中执行new或malloc操作分配了内存,进程退出前并不需要调用new或malloc,因为系统会自动进行释放。但这个静态成员指针变量需要多少分配,又应该如果处理呢,最近在项目代码中看到这样的例子,和大家分享一下。
王亚昌
2018/08/03
1.6K0
java 静态变量 存储_java中,类的静态变量如果是对象,该对象将存储在内存的哪个区域?…
Java字节码与Native机器码不同,字节码是运行在JVM这一平台上的,字节码在被解释的过程中,具体的执行方式因JVM的不同实现而不同,但是对于JVM来说,它的各种不同实现都必须要遵循Java虚拟机规范。JVM的运行时数据区包含以下部分:
全栈程序员站长
2022/08/11
1.8K0

相似问题

完全释放静态对象内存

11

如何在静态类中释放字典上的内存?

10

在非静态类c#中从静态方法中释放内存块

18

字典没有释放内存

13

Python释放字典内存

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文