关于Java成员变量、局部变量、方法,在JVM的内存空间分配
1、變量類型
2、類的結構
下面是一般類的結構
3、類的編譯運行時JVM內存的變化
JVM(Java 虛擬機)主要包括三個內存空間。分別是:棧內存、堆內存、方法區內存。(堆內存和方法區內存各一個。一個線程一個棧內存)
首先類編譯后產生.class的字節碼文件,執行類加載器把.class的字節碼文件加載到方法區內存(方法的代碼片段以及整個類的代碼片段都是存儲到方法區內存當中)
找到類的程序入口(即主方法)執行到什么語句就會在對應的內存分配空間。
例如程序執行過程中使用new運算符創建的Java對象,存儲在堆內存當中。對象內部有實例變量,所以實例變量也存儲在堆內存當中。
方法調用的時候,該方法所需要的內存空間在棧內存中分配,稱為壓棧。方法執行結束后,該方法所屬的內存空間釋放,稱為彈棧。
下面分析一下案例:
以上有三個類分別是Computer類、Student類、Test類、編譯運行將產生Computer.class、Student.class、Test.class的字節碼文件。因為還用到String類,所以String.class等字節碼文件一起載入到方法區,然后找到程序入口main,方法main被壓棧。
Computer computer=new Computer(); 在堆里創建Computer 對象,實例變量有price和type,然后對象的地址0x1234給到引用computer。引用computer在main方法里面,所以引用computer在棧。Student student=new Student(); 也跟上面一樣。
student.com=computer; 是將computer的地址0x1234給到Student對象的com實例變量里。所以student.com.price是student指向的0x2451地址找到com,com指向的0x1234地址找到price;computer.price是computer指向的0x1234地址找到price;雖然結果是相同的,但是student.com.price可以體現關聯性
computer.price=4999.9; 與 student.name=“jack”;都是將地址給到對應的引用上。接下來然后遇到m();的調用,把它壓棧,方法里面的局部變量也在棧里面,方法m();執行完彈棧,跟隨的局部變量str也失效。然后執行完代碼mian方法也彈棧。(先進后出,后進先出)
擴展
-
訪問實例變量的語法格式:
讀取數據——>引用.變量名;修改數據——>引用.變量名=值; -
數據類型:
數據類型分為基本數據類型(byte short int long float double boolean char)和引用數據類型(開發包的類(String…等)以及自己定義的類)
數據類型的默認值
-
三塊內存當中變化最頻繁的是棧內存,最先有數據的是方法區內存,垃圾回收器主要針對的是堆內存。
-
垃圾回收器(自動垃圾回收機制、GC機制)什么時候會考慮將某個Java對象的內存回收呢?
- 空引用訪問“實例“相關的數據一定會出現空指針異常。
以上是個人對JVM的理解,若有錯誤歡迎指出
總結
以上是生活随笔為你收集整理的关于Java成员变量、局部变量、方法,在JVM的内存空间分配的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: codelite13 wxWidgets
- 下一篇: Java代理设计模式(Proxy)的具体