为什么这ç§å†…存管ç†æŠ€å·§æœ‰æ•ˆï¼Ÿ

时间:2015-05-19 10:44:48

标签: c# memory-management unity3d

å‚考this Unity documentation并转到

部分
  

垃圾收集缓慢但ä¸é¢‘ç¹çš„大堆

    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;

诀çªæ˜¯åœ¨ç¨‹åºå¯åŠ¨æ—¶é¢„先分é…一些内存å—。

为什么这个技巧有效?

这些å—是å¦æ˜¯ï¼ƒ34;注册的&#34; (或者&#34;绑定&#34;)当应用程åºè¢«é¢„先分é…时,å³ä½¿åœ¨tmp完æˆæ—¶é‡Šæ”¾Start(),æ“作系统ä»ä¼šå¤„ç†è¿™äº›å—as&#34;注册&#34;申请? 由于å—å·²ç»æ³¨å†Œï¼†ï¼ƒ34;到应用程åºï¼Œå› æ­¤åº”用程åºçš„堆大å°æ‰©å±•åˆ°ä¸€å®šå¤§å°ï¼Œå¹¶ä¸”下次获å–内存å—时,æ“作系统将从该应用程åºçš„堆中选择它。

我的解释是å¦æ­£ç¡®ï¼Ÿæ— è®ºæ˜¯æˆ–å¦ï¼Œæœ‰äººå¯ä»¥è¯·è¯¦ç»†è§£é‡Šï¼Œè°¢è°¢ã€‚

2 个答案:

答案 0 :(得分:5)

è¿™ä¸æ˜¯ä¸€ä¸ªçœŸæ­£çš„伎俩。这是Unity3D部分处ç†å†…存的方å¼ã€‚

在Unity3D中,您拥有由Mono处ç†å¹¶å°†è¢«åžƒåœ¾æ”¶é›†çš„对象,以åŠç”±Unity处ç†çš„对象,这些对象ä¸ä¼šè¢«åžƒåœ¾å›žæ”¶ã€‚字符串,整数等由Mono自动清ç†ï¼Œæˆ‘们ä¸å¿…担心这一点。纹ç†ï¼ˆ2D)等ä¸æ˜¯ï¼Œæˆ‘们必须手动处ç†è¿™äº›å¯¹è±¡ã€‚

当å‘出内存请求时,首先å‘生的事情是内存管ç†å™¨ä»Žæ“作系统扫æ应​​用程åºå½“å‰åˆ†é…的内存,以获得足以存储您请求的数æ®çš„å—。如果找到匹é…项,则使用该内存。如果未找到匹é…项,则应用程åºå°†ä»ŽOS请求é¢å¤–的内存以存储您的数æ®ã€‚当这些数æ®ä¸å†ç”¨å®Œæ—¶ï¼Œå®ƒä¼šè¢«åžƒåœ¾æ”¶é›†ï¼Œä½†åº”用程åºä»ä¿ç•™è¯¥å†…存。本质上,它在内存上设置一个标志,表示它是“å¯ç”¨çš„â€æˆ–å¯é‡æ–°åˆ†é…的。这样就å¯ä»¥é€šè¿‡æ°¸ä¸è¿”回æ¥å‡å°‘对æ“作系统的内存请求。

è¿™æ„味ç€ä¸¤ä»¶äº‹;

1)您的应用程åºçš„内存将继续增长,并且ä¸ä¼šå°†å†…存返回到æ“作系统。在移动设备上,这很å±é™©ï¼Œå°±åƒä½ ä½¿ç”¨å¤ªå¤šå†…存一样,你的应用程åºå°†è¢«ç»ˆæ­¢ã€‚

2)您的应用程åºå®žé™…上å¯èƒ½ä¼šåˆ†é…比实际需è¦æ›´å¤šçš„内存。这是由于内存碎片造æˆçš„。应用程åºçš„内存池中å¯èƒ½æœ‰10MBçš„å¯ç”¨å†…存,但这些内存中的éžå†…存大到足以容纳您需è¦å­˜å‚¨çš„æ•°æ®ã€‚因此,应用程åºå¯èƒ½ä¼šä»Žæ“作系统请求更多内存,因为没有å¯ç”¨çš„å•ä¸ªè¿žç»­å†…存。

因为您正在创建一个大对象,因此请求内存,当您将该对象设置为null并å‘垃圾回收器å‘出应用程åºä¸å†éœ€è¦å†…存的信å·æ—¶ï¼Œå°†å†…å­˜é‡æ–°åˆ†é…给其他内容会更快。对象而ä¸æ˜¯ä»ŽOS请求é¢å¤–的内存。这就是为什么ç†è®ºä¸Šè¿™ä¸ªç‰¹å®šçš„方法很快并且会导致较少的性能峰值,因为垃圾收集器的调用次数较少。特别是因为这是一个大的,连续的内存分é…。

答案 1 :(得分:4)

  

为什么这个技巧有效?

这个技巧有效,因为应用程åºä¸ä¼šå°†å†…存返回给æ“作系统,除éžæ“作系统内存管ç†å™¨å¾ˆä½Žå¹¶æ˜Žç¡®è¦æ±‚它们这样åšï¼Œç„¶åŽå®ƒä»¬å°†å°½å¯èƒ½åœ°é‡Šæ”¾ã€‚å‡è®¾ä¸€æ—¦åˆ†é…了内存,就会å†æ¬¡éœ€è¦å®ƒã€‚如果已ç»åˆ†é…,​​则没有ç†ç”±å°†å…¶è¿”回给æ“作系统,除éžç¡®å®žéœ€è¦ä½¿ç”¨å®ƒã€‚