知識點乾貨--內存優化【1】之內存簡介

元宵節,又稱上元節、小正月、元夕或燈節,是春節之後的第一個重要節日,是中國亦是漢字文化圈的地區和海外華人的傳統節日之一。正月是農曆的元月,古人稱夜爲“宵”,所以把一年中第一個月圓之夜正月十五稱爲元宵節。
中國古俗中,上元節(元宵節)、中元節、下元節合稱三元。元宵節始於2000多年前的漢朝。漢文帝時下令將正月十五定爲元宵節。漢武帝時,“太一神”祭祀活動定在正月十五(太一:主宰宇宙一切之神)。司馬遷創建“太初曆”時,就已將元宵節確定爲重大節日。
傳統習俗出門賞月、燃燈放焰、喜猜燈謎、共吃元宵、拉兔子燈等。此外,不少地方元宵節還增加了耍龍燈、耍獅子、踩高蹺、劃旱船、扭秧歌、打太平鼓等傳統民俗表演。
傳說元宵節是漢文帝時爲紀念“平呂”而設。漢高祖劉邦死後,呂后之子劉盈登基爲漢惠帝。惠帝生性懦弱,優柔寡斷,大權漸漸落在呂后手中.漢惠帝病死後呂后獨攬朝政把劉氏天下變成了呂氏天下,朝中老臣,劉氏宗室深感憤慨,但都懼怕呂后殘暴而敢怒不敢言。
呂后病死後,諸呂惶惶不安害怕遭到傷害和排擠。於是,在上將軍呂祿家中祕密集合,共謀作亂之事,以便徹底奪取劉氏江山。此事傳至劉氏宗室齊王劉襄耳中,劉襄爲保劉氏江山,決定起兵討伐諸呂隨後與開國老臣周勃,陳平取得聯繫,設計解除了呂祿,“諸呂之亂”終於被徹底平定。
平亂之後,衆臣擁立劉邦的第二個兒子劉恆登基,稱漢文帝.文帝深感太平盛世來之不易,便把平息“諸呂之亂”的正月十五,定爲與民同樂日,京城裏家家張燈結綵,以示慶祝。從此,正月十五便成了一個普天同慶的民間節日——“鬧元宵”。

今天帶給大家的是關於內存優化方面的,這類文章也是一個系列。我們先從內存簡介開始吧。

Android內存是一很大的主題,涉及到內存分配,使用,回收,泄露,檢測工具,內存優化等等一系列的課題,如果想完全講透講明白,僅僅靠幾篇文章是做不到的,我這裏的總結也只起到一個拋磚引玉的作用,只涉及一些最常見的概念,總結以及優化方案等的方面,想學習一些更深入的主題,除了可以參考官方的正式文檔外,還需要各位多實踐才能掌握的更深刻。

讓我們先從瞭解內存的概念開始吧。

RAM(random access memory)隨機存取存儲器,簡稱內存。

這個大家應該比較熟悉,我們說的內存一般指的就是RAM。我們這裏拿C/C++和Java的內存做個對比來解釋RAM的概念。C/C++和Java內存分類基本上相同的,廣義上一般分爲RAM和ROM。

一般Java在內存分配時會涉及到以下幾個區域:
1、寄存器(Registers):速度最快的存儲場所,因爲寄存器位於處理器內部,所以存儲讀取都很快,但是我們在程序中無法控制。

2、棧(Stack)(和C/C++不同,Java沒有棧對象):存放基本類型的數據和對象的引用,但對象本身不存放在棧中,而是存放在堆中。

3、堆(Heap)Java使用GC回收,C/C++ 使用free,delete):堆內存用來存放由new創建的對象和數組。在堆中分配的內存,由Java虛擬機的自動垃圾回收器(GC)來管理。

4、靜態域(static field)(和C/C++不同,分帶和不帶static):靜態存儲區域就是指在固定的位置存放應用程序運行時一直存在的數據,Java在內存中專門劃分了一個靜態存儲區域來管理這些特殊的靜態數據變量,相當於C++中的全局變量。和C/C++不同,帶和不帶static,帶時有效範圍是某個文件或模塊區域有效,不帶時表示整個工程有效,在任意文件可以使用。

5、常量池(constant pool):虛擬機必須爲每個被裝載的類型維護一個常量池。常量池就是該類型所用到常量的一個有序集和,包括直接常量(如string,integer等)和對其他類型,字段和方法的符號引用。

6、非RAM存儲:硬盤等永久存儲空間
ROM是Read Only Memory的縮寫,翻譯過來就是隻讀存儲器,程序直接加載的載體。我們說的存儲空間指的就是ROM。我們可以這樣來對比理解,它就相當於電腦中的硬盤,而RAM相當於內存。

怎樣理解棧和堆以及二者簡單對比它們都可以用來存儲對象,但是所謂**“尺有所長,寸有所短”**,它們都有各自優點和缺點。
“棧”?
當定義一個變量時,Java就在棧中爲這個變量分配內存空間,當該變量退出該作用域後,Java會自動釋放掉爲該變量所分配的內存空間,該內存空間可以立即被另作他用。它的優點:是存取速度比堆要快,僅次於寄存器。但缺點也很明顯,存在棧中的數據大小與生存期必須是確定的。
“堆”?
當堆中的new產生數組和對象超出其作用域後,它們不會被釋放,只有在沒有引用變量指向它們的時候才變成垃圾,不能再被使用。即使這樣,所佔內存也不會立即釋放,而是等待被垃圾回收器收走。這也是Java比較佔內存的原因。它的特點:堆是一個運行時數據區,可以動態地分配內存大小,因此存取速度較慢。也正因爲這個特點,堆的生存期不必事先告訴編譯器,而且Java的垃圾收集器會自動收走這些不再使用的數據。

二者簡單對比,這裏只列舉兩點區別:
1、變量生命週期棧變量退出作用域後自動釋放,而堆不會。棧變量如局部變量,使用比較方便,用完也不用考慮釋放,出了作用域就會被回收;而堆使用new申請,出了作用域也不會釋放,除非沒有對象再引用它。GC纔會考慮回收。
2、變量訪問速度棧存取速度比堆要快,僅次於寄存器。但棧變量不如堆變量靈活。

以上就是關於內存的一個簡單介紹,可能稍微簡單了點,可能大家還意猶未盡,但確實由於時間原因,只能先寫這麼多了,還請見諒。後篇將會總結JVM內存和GC,敬請期待。謝謝。

本公衆號將以推送Android各種技術乾貨或碎片化知識,以及整理老司機日常工作中踩過的坑涉及到的經驗知識爲主,也會不定期將正在學習使用的新技術總結出來進行分享。每天一點乾貨小知識把你的碎片時間充分利用起來。
本公衆號將以推送Android各種技術乾貨或碎片化知識,以及整理老司機日常工作中踩過的坑涉及到的經驗知識爲主,也會不定期將正在學習使用的新技術總結出來進行分享。每天一點乾貨小知識把你的碎片時間充分利用起來。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章