C#会存在内存碎片的问题吗?

weixin_38305120 2018-05-25 10:34:45
我之前搞C++的时候,我们都会特别注重内存方面的工作,如果涉及到长时间运行的大型服务程序,都是需要专用内存池技术来解决频繁New、Delete所带来的内存碎片问题。
现在到了C#,我知道都是GC管了所有托管堆,程序员不需要自行处理。但是如果遇到那种频繁New对象特别是New大对象的时候,会不会出现内存碎片问题?还是说GC也想到了替我们解决好了这个问题呢?
...全文
1674 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
threenewbee 2018-06-04
  • 打赏
  • 举报
回复
理论上存在,但是大部分情况下,clr会很好地处理。
TOFEMALE 2018-06-03
  • 打赏
  • 举报
回复
net肯定会的,但都是自动回收的。。。如果你真的想管理内存及碎片,你就用、C/c++。。这可是一个花时间的活
liulilittle 2018-06-03
  • 打赏
  • 举报
回复
dotNET的GC会通过一些算法与策略来控制托管内存的释放 但是它一定会造成内存碎片 但GC会对这些进行优化, 意思就是说它会通过一些机制来判定当前是否需要进行移动内存 整理碎片 但一般情况下会在内存分配释放频率 很高的情况下会反应的非常剧烈,当然这也需要根据GC的工作类型来看,不同GC工作类型它的表现与频率策略 都有不同。 因为这些原因,也造就了dotNET的不建议使用非Pinned后的托管内存 因为它可能会造成内存无法访问的潜在风险。
  • 打赏
  • 举报
回复
如果我们不是 .net 开发团队的人 --> 如果我们不是微软自身的 .net framework 开发团队的人
  • 打赏
  • 举报
回复
不论是手动还是自动管理内存分配,都有这样或者那样的问题。没有一个系统不需要修改的。其实这个是相对的,是大环境选择问题。如果我们不是 .net 开发团队的人,一般就不会太在意这个了。
wanghui0380 2018-05-29
  • 打赏
  • 举报
回复
这个其实自己实验一下就OK,比如这你在这个论坛里收索“out of memory” 你会发现大部分人问的代码都是 byte[] bytes=new byte[1024*1024*40],如果说你后面不做处理,那么他频繁调用的时候就的报这个错误了。因为他的分配到“平坦连续空间”上,虽然还有大量内存,不过都是碎片达不到“平坦连续”的条件,自然就异常了。 所以你说会不会有碎片,我说上面证据说明,他有碎片
正怒月神 2018-05-29
  • 打赏
  • 举报
回复
碎片肯定会有的 大对象不会做碎片整理。 它会被直接清理掉。
  • 打赏
  • 举报
回复
引用 3 楼 weixin_38305120 的回复:
现在我就是担心会出现21.2.2那里的最后一句话的问题。。碎片化问题。。。C#该如何特殊处理呢。。。
最后一句话,并不是说系统容易崩溃,而是说 .net 系统自动优化,从而并不会频繁地做“抖动、抽风”式地空闲内存压缩操作。这是用户(基本上)无感知的。 唯一的可能是在极其特殊的——总是滥用大对象——的情况下, 应用程序突然“卡死了”几秒钟,然后也就恢复正常了。
wanghui0380 2018-05-29
  • 打赏
  • 举报
回复
当然也会有。所以net里也大量使用池对象,
  • 打赏
  • 举报
回复
.net 自己就是专业的内存池。
游北亮 2018-05-28
  • 打赏
  • 举报
回复
C#也有内存泄露问题,所以内存碎片很正常, 尤其是大量使用非托管资源时
qq14923349 2018-05-28
  • 打赏
  • 举报
回复
肯定会 不管是c# 其他语言也有
大鱼> 2018-05-25
  • 打赏
  • 举报
回复
引用 3 楼 weixin_38305120 的回复:
现在我就是担心会出现21.2.2那里的最后一句话的问题。。碎片化问题。。。C#该如何特殊处理呢。。。
所以C#很注重单例啊,主动释放啊...
weixin_38305120 2018-05-25
  • 打赏
  • 举报
回复
现在我就是担心会出现21.2.2那里的最后一句话的问题。。碎片化问题。。。C#该如何特殊处理呢。。。
  • 打赏
  • 举报
回复
如果需要详细理解可以阅读书籍《NET CLR via C#》第21章,下面我截几张图


exception92 2018-05-25
  • 打赏
  • 举报
回复
除非程序中引用了非托管的资源,GC会定时回收小对象不使用的托管资源,而对于大对象,由于在内存中移动它们比较耗费性能,所以CLR分配给它的空间是在进程地址空间上,现在GC不会压缩大对象,所以很有可能造成内存溢出的情况。
  • 打赏
  • 举报
回复
引用 3 楼 weixin_38305120 的回复:
现在我就是担心会出现21.2.2那里的最后一句话的问题。。碎片化问题。。。C#该如何特殊处理呢。。。
这个不清楚,不过可以给你几个地址希望对你有用(不保证可行) C# 内存管理优化畅想----前言 C# 内存管理优化畅想(一)---- 大对象堆(LOH)的压缩 C# 内存管理优化畅想(二)---- 巧用堆栈 C# 内存管理优化畅想(三)---- 其他方法&结语

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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