多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內(nèi)最全I(xiàn)T社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁 > 互聯(lián)網(wǎng) > 了解自動內(nèi)存管理

了解自動內(nèi)存管理

來源:程序員人生   發(fā)布時(shí)間:2014-11-25 08:12:12 閱讀次數(shù):2321次


了解自動內(nèi)存管理


當(dāng)創(chuàng)建對象、 字符串或數(shù)組時(shí),從中央池中稱為分配存儲它所需的內(nèi)存。該項(xiàng)目時(shí)不再使用,它1次占用的內(nèi)存可以回收,并用于別的東西。在過去,它通常是由http://www.vxbq.cn來分配和釋放這些塊堆內(nèi)存使用適當(dāng)?shù)暮瘮?shù)調(diào)用顯式。如今,像統(tǒng)1的單引擎的運(yùn)行時(shí)系統(tǒng)會自動為您管理內(nèi)存。自動內(nèi)存管理需要少比顯式分配/釋放的編碼工作,極大地減少了潛伏的內(nèi)存泄漏 (情況在哪里內(nèi)存分配,但永久不會隨后釋放)。

值和援用類型

當(dāng)1個(gè)函數(shù)被調(diào)用時(shí),其參數(shù)的值復(fù)制到為這1具體要求保存的內(nèi)存區(qū)域??梢詮?fù)制占用只有幾個(gè)字節(jié)的數(shù)據(jù)類型,非常迅速和容易。但是,這是常見的對象、字符串和數(shù)組要大很多,如果這些類型的數(shù)據(jù)被復(fù)制在定期的基礎(chǔ)上,它將會非常低效。榮幸的是,這不是必要的 ;從堆分配1個(gè)大的項(xiàng)目的實(shí)際存儲空間和1個(gè)小的"指針"值,用來記住它的位置。從那時(shí)起,只有指針需要復(fù)制期間傳遞的參數(shù)。只要運(yùn)行時(shí)系統(tǒng)可以找到由指針標(biāo)識的項(xiàng),可以作為必要時(shí)常常使用數(shù)據(jù)的單個(gè)副本。

直接存儲和復(fù)制期間參數(shù)傳遞的類型稱為值類型。這些包括整數(shù)、 浮點(diǎn)數(shù)、 布爾值和統(tǒng)1的結(jié)構(gòu)類型(例如,色彩和Vector3)。在堆上分配,然后通過指針訪問的類型稱為援用類型,由于只是存儲在變量中的值"是指"真實(shí)的數(shù)據(jù)。援用類型的例子包括對象、 字符串和數(shù)組。

分配和垃圾回收

內(nèi)存管理器跟蹤的領(lǐng)域它明知是未使用的堆中。當(dāng)1座新的內(nèi)存要求時(shí) (說當(dāng)1個(gè)對象被實(shí)例化)時(shí),經(jīng)理選擇要從中分配塊未使用的區(qū)域,然后從已知未使用的空間中刪除已分配的內(nèi)存。后續(xù)要求的處理方式相同,直到?jīng)]有自由的范圍不夠大,沒法分配所需的塊大小。在這1點(diǎn)上是極不可能從堆中分配的所有內(nèi)存都都仍在使用。只能訪問堆上的參考項(xiàng)目,只要仍有可以找到它的援用變量。如果指向的內(nèi)存塊的所有援用都都不見了(即,援用變量已被重新分配或它們都是都現(xiàn)已超越范圍的本地變量) 然后它占用的內(nèi)存可以安全地重新分配。

要肯定哪堆塊不再使用,內(nèi)存管理器搜索所有當(dāng)前活動的援用變量,并標(biāo)志著他們稱為"活著"的塊。在搜索結(jié)束后,任何活塊之間的空間被認(rèn)為是空的內(nèi)存管理器,可以用于后續(xù)分配。緣由很明顯,定位和釋放未使用的內(nèi)存的進(jìn)程被稱為垃圾搜集(或簡稱 GC)。

優(yōu)化

垃圾搜集是自動與不可見的http://www.vxbq.cn,但搜集進(jìn)程實(shí)際上需要大量的 CPU時(shí)間,在幕后。如果應(yīng)用得當(dāng),自動內(nèi)存管理通常將等于或擊敗手動分配,以整體的性能。但是,相當(dāng)重要的是對http://www.vxbq.cn來講,避免毛病,將觸發(fā)比必要更常常搜集器并介紹在履行暫停。

有1些臭名昭著的算法,可以是 GC的噩夢,雖然他們看起來無辜乍1看。重復(fù)字符串聯(lián)接是1個(gè)經(jīng)典的例子:-

function ConcatExample(intArray: int[]) {
    var line = intArray[0].ToString();
   
    for (i = 1; i < intArray.Length; i++) {
        line += ", " + intArray[i].ToString();
    }
   
    return line;
}
 
 

這里關(guān)鍵的細(xì)節(jié)是新片不會添加到地方中的字符串、 1個(gè)接1個(gè)。到底產(chǎn)生了甚么是周圍循環(huán)的每次行變量上之前的內(nèi)容變得死寂了 ― ―1個(gè)全新的字符串分配包括原片加末尾的新部份。由于字符串獲得與增加值的我更長的時(shí)間,所用的堆空間正在消耗也增加,所以它是容易使用了數(shù)百個(gè)字節(jié)的可用堆空間的每次調(diào)用此函數(shù)。如果您需要將許多字符串聯(lián)接在1起更好的選擇是單聲道庫System.Text.StringBuilder類。

但是,即便重復(fù)的串連不會造成太多的麻煩,除非它叫做頻繁,并在通常意味著該框架的統(tǒng)1更新。就像:-

var scoreBoard: GUIText;
var score: int;
 
function Update() {
    var scoreText: String = "Score: " + score.ToString();
    scoreBoard.text = scoreText;
}
 
 

你什么時(shí)候分配新的字符串調(diào)用 Update時(shí)每次和生成新的垃圾不斷淌出。大多數(shù)是可以通過更新文本,僅當(dāng)比分更改時(shí)保存:-

var scoreBoard: GUIText;
var scoreText: String;
var score: int;
var oldScore: int;
 
function Update() {
    if (score != oldScore) {
        scoreText = "Score: " + score.ToString();
        scoreBoard.text = scoreText;
        oldScore = score;
    }
}
 
 

當(dāng)1個(gè)函數(shù)返回?cái)?shù)組值時(shí)產(chǎn)生的另外一個(gè)潛伏的問題:-

function RandomList(numElements: int) {
    var result = new float[numElements];
   
    for (i = 0; i < numElements; i++) {
        result[i] = Random.value;
    }
   
    return result;
}
 
 

這類類型是函數(shù)的非常優(yōu)雅,交通便捷,當(dāng)創(chuàng)建1個(gè)新數(shù)組,用值填充。但是,如果它反復(fù)調(diào)用然后新鮮內(nèi)存將分配每次。由于數(shù)組可以是很大,可用堆空間可以得到使用迅速上升,致使頻繁的垃圾回收。若要避免此問題的1種方法是要使用的數(shù)組是1個(gè)援用類型的事實(shí)。可以在這個(gè)函數(shù)中修改成1個(gè)函數(shù)作為參數(shù)傳遞的數(shù)組和結(jié)果不會在函數(shù)返回后。像上面常常被替換之類的功能:-

function RandomList(arrayToFill: float[]) {
    for (i = 0; i < arrayToFill.Length; i++) {
        arrayToFill[i] = Random.value;
    }
}
 
 

這只是用新值替換現(xiàn)有數(shù)組的內(nèi)容。雖然這需要初始分配的數(shù)組必須在調(diào)用代碼中 (這看起來有點(diǎn)不雅),該函數(shù)將不會產(chǎn)生任何新的垃圾,當(dāng)它被調(diào)用時(shí)。

要求集合

如上文所述,它最好盡可能避免分配。不過,既然他們不能完全消除,但也有兩個(gè)主要的策略,你可使用盡可能減少它們侵入游戲:-

具有快速和頻繁的垃圾回收的小堆

這類策略常常是游戲的最好的有長時(shí)間在哪里光滑的幀速率是游戲的主要關(guān)注的游戲。這樣的比賽通常會頻繁地分配小塊,但這些塊將只扼要地被使用。在 iOS上使用這類策略時(shí)的典型堆大小是大約 200 KB,垃圾回收會約5ms iPhone 3g。如果堆增加到 1 MB時(shí),該集合將約 7ms。因此,它可以有益于有時(shí)要求普通幀間隔的垃圾回收。這通常會使集合比嚴(yán)格必須更常常產(chǎn)生,但他們將處理速度快、 影響最小的游戲:-

if (Time.frameCount % 30 == 0)
{
   System.GC.Collect]();
}
 
 

但是,你應(yīng)當(dāng)謹(jǐn)慎使用這類技術(shù),檢查事件探查器統(tǒng)計(jì)信息,以確保它真的減少搜集時(shí)間為你的游戲。

大堆與緩慢但很少產(chǎn)生垃圾回收

這1戰(zhàn)略合適的游戲撥款 (和集合) 是相對較少,可以在游戲暫停期間處理。它是用于堆是1樣大的而不是如此之大,讓您的利用程序由于系統(tǒng)內(nèi)存不足 OS被殺害。但是,單聲道的運(yùn)行時(shí)避免擴(kuò)大堆自動如果可能的話。您可以通過在啟動進(jìn)程中預(yù)1些占位符空間手動擴(kuò)大堆 (即您實(shí)例化1個(gè)純潔的影響,內(nèi)存管理器分配的"無用"對象):-

function Start() {
    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 (var i : int = 0; i < 1024; i++)
        tmp[i] = new byte[1024];
 
    // release reference
        tmp = null;
}
 
 
 

1個(gè)足夠大的堆應(yīng)當(dāng)不得到完全填滿那些暫停游戲,可以容納1個(gè)集合之間。這樣的停頓時(shí),您可以顯式要求集合:-

System.GC.Collect();
 
 

再次,你應(yīng)當(dāng)照顧使用此策略時(shí),注意到探查器統(tǒng)計(jì)信息而不只在假定它有預(yù)期的效果。

可重用的對象池

有很多情況下,在那里您可以免生成垃圾僅通過減少創(chuàng)建和燒毀的對象的數(shù)目。有某些類型的對象在游戲中,如子彈頭,可能會遇到幾遍,即便只有1小部份曾將播放1次。在這類情況下,很有可能要重用的對象,而不是摧毀舊的并替換為新的。

進(jìn)1步的信息

內(nèi)存管理是奧妙和復(fù)雜須大量的學(xué)術(shù)努力1直致力。如果你有興趣學(xué)習(xí)更多有關(guān)它memorymanagement.org是1種優(yōu)秀的資源,列出了許多出版物和在線文章。在Sourcemaking.com維基百科的頁面,可以找到有關(guān)對象池的進(jìn)1步信息.

 

生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 真人毛片免费全部播放完整 | 秋霞伊人网 | 久久久精品成人免费看 | 国产成人啪精品午夜小说 | 亚洲成a人v欧美综合天 | 日本在线观看一区二区三区 | 91视频一区二区三区 | 黑人巨大粗xxxxxx | 可以在线观看的黄色网址 | 亚洲人成片在线观看 | 波多野结衣视频免费 | 日韩欧美视频一区二区在线观看 | 国产一级特黄aa级特黄裸毛片 | 成人在线精品 | 动漫日本在线免费观看 | 国产成人综合网亚洲欧美在线 | 亚洲区欧美区小说区图片区 | 亚洲免费片 | 久久这里是精品 | 精品视频一二三区 | 欧美国产综合日韩一区二区 | 亚洲免费毛片 | 一二三四视频观看中文在线看 | 久草视频福利在线观看 | 欧美一级视频在线观看欧美 | 国产91精品黄网在线观看 | 国产成人毛片视频不卡在线 | 精品成人资源在线观看 | 特黄的欧美毛片 | 一级做a爰片性色毛片男 | 亚洲综合亚洲国产尤物 | 最近免费中文字幕大全高清片 | 国产精品久久久久久久久久久威 | 中文国产成人精品久久一区 | 欧美日韩小说 | 亚洲一区二区免费看 | 欧美成人精品福利网站 | 日韩在线aⅴ免费视频 | 香蕉在线精品视频在线观看2 | 国产欧美日韩高清专区手机版 | 国产日韩一区在线精品欧美玲 |