【全棧之路】JAVA基礎課程二_數據類型和垃圾回收機制(20190611v1.0)

歡迎進入JAVA基礎課程

博客地址:https://blog.csdn.net/houjiyu...
本系列文章將主要針對JAVA一些基礎知識點進行講解,爲平時概括所總結,不論是剛接觸JAVA開發菜鳥仍是業界資深人士,都但願對廣大同行帶來一些幫助。如有問題請及時留言或加QQ:243042162。算法

寄語:
經歷過國考、省考,參加過各類證書考試,無疑對於上了年紀的人來講時刻有着莫大的危機感,時刻想着如何擺脫目前的困境。常常跟身邊的同事去討論20年後你在這個行業處於什麼位置,當想一想若是20年後還處於如今的位置是多麼可怕的一件事情。 悟性能夠差點,時間可晚點,但學習跟積累必須跟上,與時俱進,搬磚人才可能脫胎換骨,收割事業的成就感與知足感。

數據類型

1. 基礎數據類型:數組

  • 數值型網絡

    • 整型數據(byte |short |int |long)
    • 浮點類型(float |double)
  • 字符型(char)
  • 布爾型(boolean)

2. 引用數據類型:jvm

  • 類(class)
  • 接口(interface)
  • 數組
注意事項
&:左右都判斷,可做位運算和邏輯與運算符
&&:左假則結束,左真判斷右,可做邏輯與運算符

垃圾回收機制

以前網絡上見過兩個很搞笑的圖比喻C語言和JAVA之間的垃圾回收機制,以下圖所示學習

C語言
圖片描述spa

JAVA語言
圖片描述.net

(1)C的垃圾回收是人工的,工做量大,可是可控性高。
(2)JAVA是自動化的,可是可控性不好,甚至有時會出現內存溢出的狀況。
(3)System.gc(),用於調用垃圾收集器,在調用時,垃圾收集器將運行以回收未使用的內存空間。它將嘗試釋放被丟棄對象佔用的內存。然而System.gc()調用附帶一個免責聲明,沒法保證對垃圾收集器的調用。因此System.gc()並不能說是完美主動進行了垃圾回收。

1. 肯定哪些對象要進行回收

經典算法:引用計數法、可達性分析算法對象

2. 何時進行回收

  • 會在cpu空閒的時候自動進行回收
  • 在堆內存存儲滿了以後
  • 主動調用System.gc()後嘗試進行回收

3. 如何回收

相關算法:標記-清除算法、複製算法、標記-整理算法、分代收集算法blog

  • 標記-清除算法 (效率和內存碎片問題):這是最基礎的一種算法,分爲兩個步驟,第一個步驟就是標記,也就是標記處全部須要回收的對象,標記完成後就進行統一的回收掉哪些帶有標記的對象。這種算法優勢是簡單,缺點是效率問題,還有一個最大的缺點是空間問題,標記清除以後會產生大量不連續的內存碎片,當程序在之後的運行過程當中須要分配較大對象時沒法找到足夠的連續內存而形成內存空間浪費。

clipboard.png

  • 複製算法(適用於對象存活率低的場景) :複製將可用內存按容量劃分爲大小相等的兩塊,每次只使用其中的一塊。當這一塊的內存用完了,就將還存活着的對象複製到另一塊上面,而後再把已使用過的內存空間一次清理掉。這樣使得每次都是對其中的一塊進行內存回收,內存分配時也就不用考慮內存碎片等複雜狀況。只是這種算法的代價是將內存縮小爲原來的一半。

clipboard.png

  • 標記整理算法(適用於對象存活率高的場景) :標記整理算法與標記清除算法很類似,但最顯著的區別是:標記清除算法僅對不存活的對象進行處理,剩餘存活對象不作任何處理,形成內存碎片;而標記整理算法不只對不存活對象進行處理清除,還對剩餘的存活對象進行整理,從新整理,所以其不會產生內存碎片。

clipboard.png

  • 分代收集算法 (根據存活週期分爲不一樣的幾塊):分代收集算法是一種比較智能的算法,也是如今jvm使用最多的一種算法,他自己其實不是一個新的算法,而是他會在具體的場景自動選擇以上三種算法進行垃圾對象回收。

clipboard.png

相關文章
相關標籤/搜索