1. 程式人生 > 程式設計 >Android沉浸式頂部實現程式碼及效果

Android沉浸式頂部實現程式碼及效果

參考 :https://www.jianshu.com/p/12d5209ef882

<style>
    #button{
        width: 100px;
        height: 100px;
        background: red;
        cursor: pointer;
    }
</style>
<body>
   <div id="button"></div>
</body>
<script>

var button = document.getElementById('button
'); button.addEventListener('click', function () { var a = new Array(100000).fill(1); var b = new Array(20000).fill(1); }); </script> </html>

1.監聽記憶體情況

不點選的情

最後記憶體顯示的線,都變低了,因為一個,垃圾回收機制會把這部分的變數給回收掉。

第二次點選按鈕,然後藍色的一條線就是js事件的佔用記憶體情況,因為沒用重新整理頁面,所以全域性被垃圾回收掉的變數已經不佔記憶體了

瀏覽器的垃圾回收機制,是每隔3.5秒(差不多,肉眼測量)回收一次不用的記憶體

var arr = [];
var button3 = document.getElementById('button');
button3.addEventListener('click', function () {
    var a = new Array(100000);
    var b = new Array(20000);
    arr.push(b);
});

等瀏覽器第一次回收記憶體以後,瘋狂點選按鈕,之後,記憶體會變高,然後瀏覽器又回收了一次,記憶體降低了一點

,再瘋狂點選幾次,就看到記憶體又變高了,然後瀏覽器又回收了一次記憶體,之後就穩定在這個值上面。

值變得越來越高,沒用被釋放掉,即使垃圾回收了,記憶體任然被佔用不被釋放掉。

這樣就是記憶體洩漏。

但是

var b = "sssss";字串就不會造成記憶體的洩漏,因為陣列是引用,不能被釋放。但是變數會被釋放掉。

分析一下:

因為點選按鈕,以後會生成一個數組,記憶體會給這個陣列分配一個記憶體空間。執行完畢以後,分配給陣列的記憶體應該被釋放掉,但是這個陣列被外部的arr陣列儲存了引用,
它就不會被釋放掉了
就一直儲存在記憶體裡面,每次點選一次,就會再分配一個新的記憶體空間。

因為瀏覽器的記憶體是有限的,記憶體不夠的時候,就會去釋放記憶體,垃圾回收機制。記憶體不斷被佔掉,
然後新的程式變數執行記憶體不夠就會去
不停的釋放記憶體,就會讓瀏覽器越來越卡,甚至崩潰。為啥頁面邏輯越寫越多,頁面越來越卡,還會奔潰,就是記憶體管理有問題。