回覆列表
  • 1 # 春風十里飄

    加快頁面載入速度 我喜歡Google Chrome擴充套件程式,加速瀏覽器的最佳擴充套件之一是

    清除快取 如果您的磁碟空間不足,那麼您可能會發現如果清除快取,瀏覽器將會加速。

  • 2 # 武漢至尊地帶

    chrome記憶體佔用過高主要是擴充套件程式、留存網頁、瀏覽器快取等

    1、 開啟chrome 同時按下Ctrl + Shift + Delete 組合鍵,調出“清除瀏覽資料”的對話方塊,選中“清空快取”,後面的下拉列表中選擇“所有內容”,可以嘗試清除其它資料。

    2、 開啟chrome 位址列輸入 chrome://extensions/ 禁用部分擴充套件程式

    3、 開啟chrome 位址列輸入 chrome://flags  部分功能關閉

  • 3 # 北辰劍心
    垃圾回收器

    Javascript使用垃圾回收機制來自動管理記憶體。其好處是可以大幅簡化程式的記憶體管理程式碼,降低程式設計師的負擔,減少因長時間運轉而帶來的記憶體洩露問題。

    記憶體管理

    在瀏覽器中,Chrome V8引擎例項的生命週期不會很長,而且執行在使用者的機器上。如果不幸發生記憶體洩露等問題,僅僅會影響到一個終端使用者。且無論這個V8例項佔用了多少記憶體,最終在關閉頁面時記憶體都會被釋放,幾乎沒有太多管理的必要(當然並不代表一些大型Web應用不需要管理記憶體。

    Chrome的記憶體限制

    Chrome限制了所能使用的記憶體極限(64位為1.4GB,32位為1.0GB),這也就意味著將無法直接操作一些大記憶體物件。

    Chrome之所以限制了記憶體的大小,表面上的原因是V8最初是作為瀏覽器的JavaScript引擎而設計,不太可能遇到大量記憶體的場景,而深層次的原因 則是由於V8的垃圾回收機制的限制。由於V8需要保證JavaScript應用邏輯與垃圾回收器所看到的不一樣,V8在執行垃圾回收時會阻塞 JavaScript應用邏輯,直到垃圾回收結束再重新執行JavaScript應用邏輯,這種行為被稱為“全停頓”(stop-the-world)。若V8的堆記憶體為1.5GB,V8做一次小的垃圾回收需要50ms以上,做一次非增量式的垃圾回收甚至要1秒以上。這樣瀏覽器將在1s內失去對使用者的響 應,造成假死現象。如果有動畫效果的話,動畫的展現也將顯著受到影響。Chrome V8的堆構成

    V8的堆其實並不只是由老生代和新生代兩部分構成,可以將堆分為幾個不同的區域:

    * 新生代記憶體區:大多數的物件被分配在這裡,這個區域很小但是垃圾回特別頻繁

    * 老生代指標區:屬於老生代,這裡包含了大多數可能存在指向其他物件的指標的物件,大多數從新生代晉升的物件會被移動到這裡

    * 老生代資料區:屬於老生代,這裡只儲存原始資料物件,這些物件沒有指向其他物件的指標

    * 大物件區:這裡存放體積超越其他區大小的物件,每個物件有自己的記憶體,垃圾回收其不會移動大物件

    * 程式碼區:程式碼物件,也就是包含JIT之後指令的物件,會被分配在這裡。唯一擁有執行許可權的記憶體區

    * Cell區、屬性Cell區、Map區:存放Cell、屬性Cell和Map,每個區域都是存放相同大小的元素,結構簡單

    每個區域都是由一組記憶體頁構成,記憶體頁是V8申請記憶體的最小單位,除了大物件區的記憶體頁較大以外,其他區的記憶體頁都是1MB大小,而且按照1MB對齊。記憶體頁除了儲存的物件,還有一個包含元資料和標識資訊的頁頭,以及一個用於標記哪些物件是活躍物件的點陣圖區。另外每個記憶體頁還有一個單獨分配在另外記憶體區的槽緩衝區,裡面放著一組物件,這些物件可能指向其他儲存在該頁的物件。垃圾回收器只會針對新生代記憶體區、老生代指標區以及老生代資料區進行垃圾回收Chrome V8的垃圾回收機制

    如何判斷回收內容

    如何確定哪些記憶體需要回收,哪些記憶體不需要回收,這是垃圾回收期需要解決的最基本問題。我們可以這樣假定,一個物件為活物件當且僅當它被一個根物件或另一個活物件指向。根物件永遠是活物件,它是被瀏覽器或V8所引用的物件。被區域性變數所指向的物件也屬於根物件,因為它們所在的作用域物件被視為根物件。全域性物件(Node中為global,瀏覽器中為window)自然是根物件。瀏覽器中的DOM元素也屬於根物件如何識別指標和資料

    垃圾回收器需要面臨一個問題,它需要判斷哪些是資料,哪些是指標。由於很多垃圾回收演算法會將物件在記憶體中移動(緊湊,減少記憶體碎片),所以經常需要進行指標的改寫

    目前主要有三種方法來識別指標:

    1. 保守法:將所有堆上對齊的字都認為是指標,那麼有些資料就會被誤認為是指標。於是某些實際是數字的假指標,會背誤認為指向活躍物件,導致記憶體洩露(假指標指向的物件可能是死物件,但依舊有指標指向——這個假指標指向它)同時我們不能移動任何記憶體區域。

    2. 編譯器提示法:如果是靜態語言,編譯器能夠告訴我們每個類當中指標的具體位置,而一旦我們知道物件時哪個類例項化得到的,就能知道物件中所有指標。這是JVM實現垃圾回收的方式,但這種方式並不適合JS這樣的動態語言

    3. 標記指標法:這種方法需要在每個字末位預留一位來標記這個欄位是指標還是資料。這種方法需要編譯器支援,但實現簡單,而且效能不錯。V8採用的是這種方式。V8將所有資料以32bit字寬來儲存,其中最低一位保持為0,而指標的最低兩位為01

    V8的回收策略自動垃圾回收演算法的演變過程中出現了很多演算法,但是由於不同物件的生存週期不同,沒有一種演算法適用於所有的情況。所以V8採用了一種分代回收的策略,將記憶體分為兩個生代:新生代和老生代。新生代的物件為存活時間較短的物件,老生代中的物件為存活時間較長或常駐記憶體的物件。分別對新生代和老生代使用不同的垃圾回收演算法來提升垃圾回收的效率。物件起初都會被分配到新生代,當新生代中的物件滿足某些條件時,會被移動到老生代。V8的分代記憶體預設情況下,64位環境下的V8引擎的新生代記憶體大小32MB、老生代記憶體大小為1400MB,而32位則減半,分別為16MB和700MB。V8記憶體的最大保留空間分別為1464MB(64位)和732MB(32位)。具體的計算公式是4*reserved_semispace_space_ + max_old_generation_size_,新生代由兩塊reserved_semispace_space_組成,每塊16MB(64位)或8MB(32位)新生代新生代的特點大多數的物件被分配在這裡,這個區域很小但是垃圾回特別頻繁。在新生代分配記憶體非常容易,我們只需要儲存一個指向記憶體區的指標,不斷根據新物件的大小進行遞增即可。當該指標到達了新生代記憶體區的末尾,就會有一次清理(僅僅是清理新生代)新生代的垃圾回收演算法

    新生代使用Scavenge演算法進行回收。在Scavenge演算法的實現中,主要採用了Cheney演算法。

    Cheney演算法演算法是一種採用複製的方式實現的垃圾回收演算法。它將記憶體一分為二,每一部分空間稱為semispace。在這兩個semispace中,一個處於使用狀態,另一個處於閒置狀態。處於使用狀態的semispace空間稱為From空間,處於閒置狀態的空間稱為To空間,當我們分配物件時,先是在From空間中進行分配。當開始進行垃圾回收演算法時,會檢查From空間中的存活物件,這些存活物件將會被複制到To空間中(複製完成後會進行緊縮),而非活躍物件佔用的空間將會被釋放。完成複製後,From空間和To空間的角色發生對換。也就是說,在垃圾回收的過程中,就是透過將存活物件在兩個semispace之間進行復制。可以很容易看出來,使用Cheney演算法時,總有一半的記憶體是空的。但是由於新生代很小,所以浪費的記憶體空間並不大。而且由於新生代中的物件絕大部分都是非活躍物件,需要複製的活躍物件比例很小,所以其時間效率十分理想。複製的過程採用的是BFS(廣度優先遍歷)的思想,從根物件出發,廣度優先遍歷所有能到達的物件。

    綜上所述,Chrome的記憶體最佳化是因為V8的記憶體管理帶來的出色體驗。

  • 中秋節和大豐收的關聯?
  • 諸葛亮《隆中對》的睿智和天真,天下三分可成,為何伐魏難於登天?