『壹』 java靜態資源(靜態方法,靜態屬性)是程序一運行就載入到jvm中,還是當被調用的時候才進行載入呢
當類第一次被調用時載入(靜態方法,靜態屬性的載入就是類載入) 。
1、類中的靜態屬性會被加入到類對象(也可以叫做類的模板,是類的描述) 的構造器中,靜態方法也會被加入到類對象中。
2、當第一次使用類時,JVM會通過類載入器,載入類對象,從而初始化靜態屬性,並裝入類的方法,包括靜態方法和實例方法(方法不會被調用,只是載入,從這個意義上來說,靜態方法和實例方法是類似的)。
3、當創建類的實例對象時,JVM會調用類的構造器,從而初始化類的屬性。
(1)jvm方法在哪裡擴展閱讀:
類(包括靜態方法、屬性)載入過程:
一、載入。
根據一個類的全限定名(如cn.e.h.test.HelloWorld.class)來讀取此類的二進制位元組流到JVM內部。
將位元組流所代表的靜態存儲結構轉換為方法區的運行時數據結構(hotspot選擇將Class對象存儲在方法區中,Java虛擬機規范並沒有明確要求一定要存儲在方法區或堆區中)轉換為一個與目標類型對應的java.lang.Class對象。
二、連接。
1、驗證。
驗證階段主要包括四個檢驗過程:文件格式驗證、元數據驗證、位元組碼驗證和符號引用驗證;
2、准備。
為類中的所有靜態變數分配內存空間,並為其設置一個初始值(由於還沒有產生對象,實例變數將不再此操作范圍內);
3、解析。
將常量池中所有的符號引用轉為直接引用(得到類或者欄位、方法在內存中的指針或者偏移量,以便直接調用該方法)。這個階段可以在初始化之後再執行。
『貳』 Java構造函數(方法)存儲在jvm哪個內存里
存放到方法區當中;
new出來的是實例對象,實例對象才是存放在堆當中;
構造函數對應的是<init>方法,方法信息隨著類載入器載入到方法區當中。
棧:
以棧幀為單位,存放的不是方法具體的結構,只是通常一個方法對應一個棧幀,對應的入棧出棧就是棧幀的入棧出棧。棧幀中有局部變數表,操作數棧,方法返回地址,動態鏈接。其中局部變數表存放局部變數,包括形參,非靜態方法默認在第一個索引存放一個this變數;操作數棧用於操作局部變數表和一些值的運算,比如讀取表中變數的值進行運算,或存放相應的值到局部變數表中;方法返回地址則是用於記錄對應方法的下一條指令的地址;動態鏈接是符號引用變成的直接引用。
堆:
存放實例對象,在jdk7開始,還存放靜態變數和字元串常量池
方法區:
存放類元信息,比如完整類名全稱,public,abstract等修飾符,實現的介面有序列表等;方法信息,比如修飾符,返回類型等;JIT代碼緩存,也就是被即時編譯器編譯後的熱點代碼,用於提高性能;域信息,也就是屬性信息,比如修飾符,類型等;運行時常量池,位元組碼文件中常量池的運行時表現,類似符號引用的記錄,不過蘊含的信息更為豐富,而且具有動態性。jdk6及以前,還存放靜態變數,運行時常量池中還存放字元串常量池,到了jdk7則移到了堆中。
『叄』 java中的實例方法存在哪
HI我,我對你的問題蠻感興趣的
類的實例方法在內存中是只有一份,不過肯定不會是第一個對象中,如果是第一個對象的話,那麼當第一個對象被銷毀的時候,那麼後面的對象就永遠無法調用了...
類的實例方法存在一個專門的區叫方法區,事實上類剛裝載的時候就被裝載好了,不過它們在"睡眠",只是這些方法必須當有對象產生的時候才會"蘇醒".(比如,一個輸出類的成員變數的方法,如果連對象都沒有,何來的輸出成員變數).所以,方法在裝載的時候就有了,但是不可用,因為它沒有指象任何一個對象。
而靜態的又不一樣了,靜態的東西存在靜態區,他們和類是一個等級的,就是說只要類被裝載,它們就可以直接用.(用類名來調用).他們不依賴與任何對象,所以也不能輸出任何對象的成員屬性.(除非成員屬性也是靜態的).
而你最後的一句話也是錯的,"類的所有數據在內存中只有靜態的才又空間".
當然不是,每個對象在new的時候都會在堆區中開辟內存,用來保存對象的屬性和方法.(實際上方法保存的只是方法區的引用,如果保存的是方法本身,那麼試想一下,有多少個對象就得有多少個方法,那麼又和第一點中"實例方法在內存中只有一份拷貝"相矛盾了)
好了,事實上內存圖很復雜和麻煩,算比較深的東西了,很多用JAVA多年的人也不太了解其原理,因為開發也不要用..
『肆』 java線程存放在jvm的哪個區域方法又存放在哪個區呢
聊到JAVA中的方法,大多數人對於方法存儲在方法區還是棧區(虛擬機棧)是很迷茫的。其實方法是存在方法區的下面我們就細細說一下JVM中的 方法區 VS 棧區方法區:用於存儲已被虛擬機載入的類信息、常量、靜態變數、即時編譯器編譯後的代碼等數據,方法編譯出的位元組碼也是保存在這