c# – GCHandle固定内存/对象多少会使垃圾收集器变慢?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – GCHandle固定内存/对象多少会使垃圾收集器变慢?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1233字,纯文字阅读大概需要2分钟。
内容图文
![c# – GCHandle固定内存/对象多少会使垃圾收集器变慢?](/upload/InfoBanner/zyjiaocheng/967/62bc5c0402a84feca6041e95787dd7b3.jpg)
我确信这个答案取决于用户机器,但必须有一些固定数据的最佳实践.
我需要保存5个字节数组,每个字节包含1.048.576字节.通常我更喜欢使用GCHandle(托管)内存,但有些人说它会降低GC的速度.我知道可能会发生这种情况,但需要固定多少内存/对象才能真正影响GC?
以下是我的选择:
> GCHandle.Alloc GCHandleType.Pinned(托管).它会减慢GC ??
> Marshal.AllocHGlobal(非管理访问).不安全的代码
>使用位图在Scan0中保存数据(非托管访问).不安全的代码
解决方法:
这是一个无可救药的无法解决的问题.固定物体不会对GC造成太大的影响,当GC压缩堆时,它只是路上的一块石头.通过简单地跳过堆的固定部分,可以轻松地在岩石周围工作.
更糟糕的结果是它将对收集完成后运行的代码产生持久影响.由于堆没有很好地压缩,引用的位置不是那么好,因此处理器将无法从CPU缓存中获得尽可能多的里程数.量化这种减速是不可能的,这在很大程度上取决于之后运行的代码类型.只有它更糟糕并持续一段时间,直到下一个GC.
唯一的好建议是,如果你必须钉,那么尽可能短的时间这样做.并且避免在固定对象时可能发生集合的情况.粗略地说,这意味着您在保持引脚的同时避免分配内存.如果程序运行多个线程并不总是实用的,那么< gcServer> .config文件中的元素很有吸引力.它选择使用更多内存的不同GC策略,但为线程提供自己的GC堆段.没有简单的指导来确定何时执行此操作,需要使用实际数据集进行分析.
Marshal.AllocHGlobal和Bitmap都没有对GC堆有任何显着影响,它们从非托管内存堆中分配.
内容总结
以上是互联网集市为您收集整理的c# – GCHandle固定内存/对象多少会使垃圾收集器变慢?全部内容,希望文章能够帮你解决c# – GCHandle固定内存/对象多少会使垃圾收集器变慢?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。