『壹』 java靜態變數存儲在哪個區
java程序在內存中的存儲分配情況:
一、堆區:
1.存儲的全部是對象,每個對象都包含一個與之對應的class的信息。(class的目的是得到操作指令)
2.jvm只有一個堆區(heap)被所有線程共享,堆中不存放基本類型和對象引用,只存放對象本身 ujiuye
棧區:
1.每個線程包含一個棧區,棧中只保存基礎數據類型的對象和自定義對象的引用(不是對象),對象都存放在堆區中
2.每個棧中的數據(原始類型和對象引用)都是私有的,其他棧不能訪問。
3.棧分為3個部分:基本類型變數區、執行環境上下文、操作指令區(存放操作指令)。 ujiuye
方法區:
1.又叫靜態區,跟堆一樣,被所有的線程共享。方法區包含所有的class和static變數。
2.方法區中包含的都是在整個程序中永遠唯一的元素,如class,static變數。
二、內存分區
而內存分為四個區:stack segment,heap segment,data segment,code segment;
stack 區存放函數參數和局部變數;heap 區存放對象;data 區存放static 的變數或者字元串常量; code 區存放類中的方法;
因此,靜態變數是存放在data區的 !
『貳』 java里的靜態成員變數是放在了堆內存還是棧內存
堆區:
1.存儲的全部是對象,每個對象都包含一個與之對應的class的信息。(class的目的是得到操作指令)
2.jvm只有一個堆區(heap)被所有線程共享,堆中不存放基本類型和對象引用,只存放對象本身
棧區:
1.每個線程包含一個棧區,棧中只保存基礎數據類型的對象和自定義對象的引用(不是對象),對象都存放在堆區中
2.每個棧中的數據(原始類型和對象引用)都是私有的,其他棧不能訪問。
3.棧分為3個部分:基本類型變數區、執行環境上下文、操作指令區(存放操作指令)。
方法區:
1.又叫靜態區,跟堆一樣,被所有的線程共享。方法區包含所有的class和static變數。
2.方法區中包含的都是在整個程序中永遠唯一的元素,如class,static變數。
程序運行時,我們最好對數據保存到什麼地方做到心中有數。特別要注意的是內在的分配,有六個地方都可以保存數據:
1、 寄存器。這是最快的保存區域,因為它位於和其他所有保存方式不同的地方:處理器內部。然而,寄存器的數量十分有限,所以寄存器是根據需要由編譯器分配。我們對此沒有直接的控制權,也不可能在自己的程序里找到寄存器存在的任何蹤跡。
2、 堆棧。駐留於常規RAM(隨機訪問存儲器)區域。但可通過它的「堆棧指針」獲得處理的直接支持。堆棧指針若向下移,會創建新的內存;若向上移,則會釋放那些內存。這是一種特別快、特別有效的數據保存方式,僅次於寄存器。創建程序時,java編譯器必須准確地知道堆棧內保存的所有數據的「長度」以及「存在時間」。這是由於它必須生成相應的代碼,以便向上和向下移動指針。這一限制無疑影響了程序的靈活性,所以盡管有些java數據要保存在堆棧里——特別是對象句柄,但java對象並不放到其中。
3、 堆。一種常規用途的內存池(也在RAM區域),其中保存了java對象。和堆棧不同:「內存堆」或「堆」最吸引人的地方在於編譯器不必知道要從堆里分配多少存儲空間,也不必知道存儲的數據要在堆里停留多長的時間。因此,用堆保存數據時會得到更大的靈活性。要求創建一個對象時,只需用new命令編制相碰的代碼即可。執行這些代碼時,會在堆里自動進行數據的保存。當然,為達到這種靈活性,必然會付出一定的代價:在堆里分配存儲空間時會花掉更長的時間
4、 靜態存儲。這兒的「靜態」是指「位於固定位置」。程序運行期間,靜態存儲的數據將隨時等候調用。可用static關鍵字指出一個對象的特定元素是靜態的。但java對象本身永遠都不會置入靜態存儲空間。
5、 常數存儲。常數值通常直接置於程序代碼內部。這樣做是安全的。因為它們永遠都不會改變,有的常數需要嚴格地保護,所以可考慮將它們置入只讀存儲器(ROM)。
6、 非RAM存儲。若數據完全獨立於一個程序之外,則程序不運行時仍可存在,並在程序的控制范圍之外。其中兩個最主要的例子便是「流式對象」和「固定對象」。對於流式對象,對象會變成位元組流,通常會發給另一台機器,而對於固定對象,對象保存在磁碟中。即使程序中止運行,它們仍可保持自己的狀態不變。對於這些類型的數據存儲,一個特別有用的技藝就是它們能存在於其他媒體中,一旦需要,甚至能將它們恢復成普通的、基於RAM的對象。
『叄』 請問JVM的java棧和方法棧有神馬區別靜態變數是分配存到哪裡的
按照虛擬機規范所述Java虛擬機棧為執行java方法(位元組碼)服務,而本地方法棧則是為執行Native方法服務,但這個在不同JVM內有不同的內部實現,比如在HotSpot JVM中Java虛擬機棧和本地方法棧被實現為同一個棧區!
HotSpot JVM中靜態欄位(包括變數和常量)被分配在方法區(又稱永久代)中類型數據結構的末尾!
(以上所述均指JDK1.6,而JDK1.7開始逐步取消永久代)
『肆』 jvm元空間存哪些數據
方法區也稱為元空間,主要存放以下數據:
常量
靜態變數:靜態變數若為對象時,則存放對象在堆中的地址
類信息
『伍』 java static變數存儲在什麼地方呢,別說什麼靜態存儲池的,我需要實際和具體的回答,是內存還是緩存
java運行時所有對象都只在JVM包裝的內存中,JVM不是跨平台的,它由系統軟體載入到內存中,很顯然,java的對象全都在內存中。
不管是靜態的不靜態的都一樣,只不過JVM自己做了內存管理,將靜態的數據存放的地區更加共用一點,非靜態的對象只在一個地方存一個殼子(類,如果類已經載入了的,沒有載入的類連殼子都木有),需要創建對象的時候才繼續向操作系統申請內存資源。
java的緩存機制,通常是指『應用性緩存』,就是在實際應用的時候,用程序實現類似cache的功能的模式,如:文件流讀寫就是在直接跟硬碟交互的內存區域加一個限制讓數據按照一定的規律進行讀寫這樣可以實時檢查通道是否異常,根據狀況調節通道大小,這樣做在大文件的持久化過程中是很有用的,但是小文件非緩存讀寫更有優勢,因為它發生通道阻塞的可能性相當小了。
『陸』 java里的靜態成員變數是放在了堆內存還是棧內
這個要看對象是否為逃逸對象,如果為非逃逸對象,會根據標量替換來把對象分解成若干個被這個方法使用的成員變數所代替,這些代替的成員變數在棧幀或寄存器上分配空間
『柒』 java靜態資源(靜態方法,靜態屬性)是程序一運行就載入到jvm中,還是當被調用的時候才進行載入呢
當類第一次被調用時載入(靜態方法,靜態屬性的載入就是類載入) 。
1、類中的靜態屬性會被加入到類對象(也可以叫做類的模板,是類的描述) 的構造器中,靜態方法也會被加入到類對象中。
2、當第一次使用類時,JVM會通過類載入器,載入類對象,從而初始化靜態屬性,並裝入類的方法,包括靜態方法和實例方法(方法不會被調用,只是載入,從這個意義上來說,靜態方法和實例方法是類似的)。
3、當創建類的實例對象時,JVM會調用類的構造器,從而初始化類的屬性。
(7)jvm存儲靜態數據擴展閱讀:
類(包括靜態方法、屬性)載入過程:
一、載入。
根據一個類的全限定名(如cn.e.h.test.HelloWorld.class)來讀取此類的二進制位元組流到JVM內部。
將位元組流所代表的靜態存儲結構轉換為方法區的運行時數據結構(hotspot選擇將Class對象存儲在方法區中,Java虛擬機規范並沒有明確要求一定要存儲在方法區或堆區中)轉換為一個與目標類型對應的java.lang.Class對象。
二、連接。
1、驗證。
驗證階段主要包括四個檢驗過程:文件格式驗證、元數據驗證、位元組碼驗證和符號引用驗證;
2、准備。
為類中的所有靜態變數分配內存空間,並為其設置一個初始值(由於還沒有產生對象,實例變數將不再此操作范圍內);
3、解析。
將常量池中所有的符號引用轉為直接引用(得到類或者欄位、方法在內存中的指針或者偏移量,以便直接調用該方法)。這個階段可以在初始化之後再執行。
『捌』 jvm靜態變數為什麼要在准備階段提前分配內存
靜態變數是在類載入的時候分配空間的,靜態變數和對象沒有關系 是在JVM第一次讀到一個類的時候載入信息的過程中分配空間的 載入過程為
1 .載入父類(如果父類已經載入過,則不在載入)。
2.初始化靜態屬性 。
3 .按順序的初始化靜態代碼塊 初始化的前提就是分配空間 。
而且靜態變數在以後的創建對象的時候不在初始化 所以一般用靜態來保存共享信息
靜態變數存在於方法區中,成員變數存在於堆內存中,成員變數所屬於對象JAVA成員變數和靜態變數的區別,成員變數隨著對象創建而存在。隨著對象被回收而消失。靜態變數隨著類的載入而存在。
靜態變數是屬於靜態存儲方式,但是屬於靜態存儲方式的量不一定就是靜態變數,例如外部變數雖屬於靜態存儲方式,但不一定是靜態變數,必須由static加以定義後才能成為靜態外部變數,或稱靜態全局變數。
靜態變數也可以用於存儲常數。具體來說,靜態變數可用const,constant或final等關鍵字標識,這時其值就會在編譯時設定,並且無法在運行時改變。編譯器通常將靜態常量與文本一起置於目標文件的文本區域,而非常量初始化數據則置於數據區。
『玖』 java中,靜態方法被調用是,存儲在內存的哪個區域是棧還是放大區還是兩者都有
在JDK8之前,靜態成員(靜態變數和靜態方法)都是存儲在方法區(永久代)中的靜態區中(這里指類被載入後,靜態成員的存儲位置)。但在JDK8之後,永久代被移除了,取而代之的是元空間(metaspace)。但元空間中存儲的主要是.class文件的元數據信息,靜態成員的存儲位置由方法區轉到了堆內存(heap)中。
不過,不管是JDK8,還是更早的版本中,靜態方法的執行(不僅僅是靜態方法,還有普通的成員方法)都是在棧內存(stack)中進行的。每個線程都會在棧內存中開辟一個棧,在調用方法時,對應的方法都會在執行這個方法的線程的棧中創建一個「棧幀」,棧幀中保存了局部變數表(基本數據類型和對象引用)、操作數棧、動態連接和返回地址等信息。等到方法執行完畢,棧幀被銷毀,對應的內存也將被釋放。
『拾』 java中,靜態變數存儲在哪個區啊,堆還是棧啊,或者說其他地方,謝謝
首先,java裡面是沒有靜態變數這個概念的,不信你自己在方法裡面定義一個static
int
i
=0;java里只有靜態成員變數。它屬於類的屬性。至於他放在那裡?樓上說的是靜態區。我不知道到底有沒有這個翻譯。但是
深入jvm里是是翻譯為方法區的。虛擬機的體系結構:堆,方法區,本地方法棧,pc寄存器。而方法區保存的就是一個類的模板,堆是放類的實例的。棧是一般來用來函數計算的。隨便找本計算機底層的書都知道了。棧里的數據,函數執行完就不會存儲了。這就是為什麼局部變數每一次都是一樣的。就算給他加一後,下次執行函數的時候還是原來的樣子。