gpt4 book ai didi

c# - 为什么这个内存管理技巧有效?

转载 作者:可可西里 更新时间:2023-11-01 09:08:52 24 4
gpt4 key购买 nike

引用this Unity documentation并转到部分

Large heap with slow but infrequent garbage collection

    var tmp = new System.Object[1024];

// make allocations in smaller blocks to avoid them to be treated in a special way, which is designed for large blocks
for (int i = 0; i < 1024; i++)
tmp[i] = new byte[1024];

// release reference
tmp = null;

诀窍是在程序启动时预先分配一些内存块。

为什么这个技巧有效?

当 block 被预分配时,它们是否以某种方式“注册”(或“绑定(bind)”)到应用程序,因此即使 tmpStart 时被释放() 完成后,操作系统是否仍将这些 block 视为已“注册”到应用程序?由于 block 已“注册”到应用程序,因此应用程序的堆大小会扩展到一定大小,下次获取内存块时,操作系统会从该应用程序的堆中获取它。

我的解释正确吗?不管是或否,谁能解释得更详细些,谢谢。

最佳答案

这不是真正的把戏。这是 Unity3D 的某些部分处理内存的方式。

在 Unity3D 中,您有一些对象由 Mono 处理并且将被垃圾回收,而一些对象由 Unity 处理,不会被垃圾回收。字符串、整数等会被 Mono 自动清理,我们不必为此担心。纹理 (2D) 等不是,我们必须手动处理这些对象。

当请求内存时,内存管理器首先从操作系统扫描应​​用程序当前分配的内存,以寻找足够大的 block 来存储您请求的数据。如果找到匹配项,则使用该内存。如果未找到匹配项,则应用程序将从操作系统请求额外的内存以存储您的数据。当这些数据不再用完时,它就会被垃圾回收,但应用程序仍会保留该内存。本质上,它在内存上设置了一个标志,表明它是“可用的”或可重新分配的。这通过永不返回来减少对操作系统的内存请求。

这意味着两件事;

1) 您的应用程序的内存只会继续增长,不会将内存返回给操作系统。在移动设备上,这很危险,因为如果您使用太多内存,您的应用程序将被终止。

2) 您的应用程序实际上可能分配了比实际需要更多的内存。这是由于内存碎片。您的应用程序内存池中可能有 10MB 的可用内存,但这些 block 中没有一个大到足以容纳您需要存储的数据。因此,应用程序可能会向操作系统请求更多内存,因为没有一 block 可用的连续内存可供使用。

因为您正在创建一个大对象,因此需要内存,当您将该对象设置为 null 并向垃圾收集器发出应用程序不再需要内存的信号时,将保留的内存重新分配给其他对象会更快对象而不是从操作系统请求额外的内存。这就是为什么理论上这种特定方法速度很快并且会导致较少的性能峰值,因为垃圾收集器的调用频率较低。特别是因为这是一个大的、连续的内存分配。

关于c# - 为什么这个内存管理技巧有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30323411/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com