Java新手問題 04 虛擬機相關

關於基本類型和引用類型

主要是關於:基本類型和引用類型在本質上有什麼區別. 
基本類型主要包括:
boolean、byte、short、char、int、long、float、double。
其它全部的類型都屬於引用類型。

Question:這兩種類型在內存存儲上有什麼區別

  • 基礎類型在聲明的同時系統會給予分配內存空間.
  • 引用類型在聲明時系統只是分配了引用空間,數據空間沒有分配.引用類型變量在聲明後必須經過實例化開闢數據空間,才能對變量所指向的對象進行訪問。
  • [內存中兩種類型的狀態]({{ "/images" | prepend: site.baseurl }}//2017-07-08-java-basic-four-mem-of-primary-ref.png)
  • 如上圖所示,基礎類型放在棧內存(Stack memory)中,而引用類型是將引用地址放在棧內存中,實際對象放在堆內存(Heap memory)中。

Question:這兩種類型在性能上有什麼區別

這要從堆棧的優點和區別提及:html

  • 棧的優點是,存取速度比堆要快,僅次於寄存器,棧數據能夠共享。但缺點是,存在棧中的數據大小與生存期必須是肯定的,缺少靈活性。
  • 而堆是一個運行時數據區,類的(對象從中分配空間。這些對象經過new、newarray、anewarray和multianewarray等指令創建,它們不須要程序代碼來顯式的釋放。堆是由垃圾回收來負責的,堆的優點是能夠動態地分配內存大小,生存期也沒必要事先告訴編譯器,由於它是在運行時動態分配內存的,Java的垃圾收集器會自動收走這些再也不使用的數據。但缺點是,因爲要在運行時動態分配內存,存取速度較慢。
  • 因此性能方面來講,使用基礎數據類型確定會比使用引用數據類型速度快。java

    堆相對進程來講是全局的,可以被全部線程訪問;而棧是線程局部的,只能本線程訪問。打個比方,棧就比如我的小金庫,堆就比如國庫。你從我的小金庫拿錢去花,不須要辦什麼手續,拿了就花,可是錢數有限;而國庫裏面的錢雖然不少,可是每次申請花錢要打報告、蓋圖章、辦 N 多手續,耗時又費力。
      一樣道理,因爲堆是全部線程共有的,從堆裏面申請內存要進行相關的加鎖操做,所以申請堆內存的複雜度和時間開銷比棧要大不少;從棧裏面申請內存,雖然又簡單又快,可是棧的大小有限,分配不了太多內存。jvm

Question:這兩種類型對於 GC有什麼區別

  • 基本類型的數據是能夠共享的,因此整個jvm可能會只有一個基礎類型,回收相對較快也較容易.

參考網址

相關文章
相關標籤/搜索