Java 數據存儲


寄存器register

   最快的存儲區, 由編譯器根據需求進行分配,我們在程序中無法控制

  • 最快的存儲區(由編譯器根據需求分配,無法從程序中控制)
  • 位於處理器內部
  • 數量有限

 

常量存儲constant storage

    存放字符串常量和基本類型常量(public static final)

  • 常量值通常直接存放在程序代碼內部
  • 有時在嵌入式系統中,常量本身會和其他部分分割離開,所以在這種情況下,可以選擇將其放在ROM中 (ROM,Read Only Memory,只讀內存。一種只能讀出事先所存數據的固態半導體存儲器,它相當於PC機上的硬盤,用來存儲和保存數據。RAM和ROM相比,兩者的最大區別是RAM在斷電以后保存在上面的數據會自動消失,而ROM就不會。)

 

靜態存儲區static storage

    存放靜態成員(static定義的)包括靜態成員變量和靜態成員方法(類方法)
  • 靜態是指“在固定的位置”
  • 靜態存儲里存放程序運行時一直存在的數據
  • 可用關鍵字static來標識一個對象的特定元素是靜態的
  • 但JAVA對象本身從來不會存放在靜態存儲空間里

重點注意:

  1. 靜態方法中可以直接調用同類中的靜態成員,但不能直接調用非靜態成員。如果希望在靜態方法中調用非靜態變量,可以通過創建類的對象,然后通過對象來訪問非靜態變量。
  2. 在普通成員方法中,則可以直接訪問同類的非靜態變量和靜態變量。
  3. 靜態方法中不能直接調用非靜態方法,需要通過對象來訪問非靜態方法。

棧stack

    存放基本類型的變量數據和對象,數組的引用,但對象本身不存放在棧中,而是存放在堆(new 出來的對象)或者常量池中(字符串常量對象存放在常量池中)

  • 速度僅次於寄存器 

  • 通過它的“棧指針”從處理器獲得支持; 
  • 棧指針向下移動,分配新內存;向上,釋放內存; 
  • 這一約束限制了程序的靈活性:創建程序時,JAVA編譯器必須知道存儲在棧內所有數據的確切大小和生命周期,生成相應代碼,以便上下移動棧指針;因此某些JAVA數據存儲在棧中,而JAVA對象不存儲在其中,位於通用RAM中 (RAM,random access memory隨機存取存儲器),與CPU直接交換數據的內部存儲器,也叫主存(內存)。隨時讀寫,速度很快,通常作為臨時數據存儲媒介)

特點

函數中定義的基本類型變量,對象的引用變量都在函數的棧內存中分配。

棧內存特點,數數據一執行完畢,變量會立即釋放,節約內存空間。

棧內存中的數據,沒有默認初始化值,需要手動設置。

 

堆heap

    存放所有new出來的對象

  • 位於通用RAM中,用來存放所有的JAVA對象
  • 不同於棧的好處:不需要知道存儲數據分配多少區域以及生命周期,有很大的靈活性
  • 需要創建一個對象時,只需new一行代碼,執行這行代碼,會自動在堆里進行存儲分配
  • 為這種靈活性付出相應代碼,用堆進行存儲分配比用棧進行存儲需要更多的時間

 

特點

堆內存用來存放new創建的對象和數組。
堆內存中所有的實體都有內存地址值。
堆內存中的實體是用來封裝數據的,這些數據都有默認初始化值。
堆內存中的實體不再被指向時,JVM啟動垃圾回收機制,自動清除,這也是JAVA優於C++的表現之一(C++中需要程序員手動清除)。

 

運行時數據區包括:虛擬機棧區,堆區,方法區,本地方法棧,程序計數器 

虛擬機棧區(棧區)

也就是我們常說的棧區,線程私有,存放基本類型,對象的引用和returnAddress,在編譯期間完成分配。

堆區

JAVA堆,也稱GC堆,所有線程共享,存放對象的實例和數組,JAVA堆是垃圾收集器管理的主要區域。

方法區

所有線程共享,存儲已被虛擬機加載的類信息,常量,靜態變量,即時編譯器編譯后的代碼等數據。這個區域的內存回收目標主要是針對常量池的對象的回收和對類型的卸載。

程序計數器

線程私有,每個線程都有自己獨立的程序計數器,用來指示下一條指令的地址。

本地方法棧(Native Method Stacks)

與虛擬機棧所發揮的作用是非常相似的,其區別不過是虛擬機棧為虛擬機執行Java方法(也就是字節碼)服務,而本地方法棧則是為虛擬機使用到的Native方法服務。虛擬機規范中對本地方法棧中的方法使用的語言、使用方式與數據結構並沒有強制規定,因此具體的虛擬機可以自由實現它。甚至有的虛擬機(譬如Sun HotSpot虛擬機)直接就把本地方法棧和虛擬機棧合二為一。與虛擬機棧一樣,本地方法棧區域也會拋出StackOverflowError和OutOfMemoryError異常。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM