本文目錄一覽:
- 1、Java的方法區和本地方法區有何不同?什麼是Native Method?
- 2、java方法區中包含哪些內容,常量池中包含哪些內容
- 3、Java內存中的棧,堆和方法區的用法有什麼不同
- 4、jdk1.8關於方法區的變化
- 5、JAVA中方法區是不是堆的一部分
- 6、Java方法區和堆分別儲存什麼
Java的方法區和本地方法區有何不同?什麼是Native Method?
java的方法區在jdk7及以前是永久代,使用的是虛擬機的內存,而到了jdk8,元空間取代了永久代,使用的是本地的內存。
Native Method是本地方法的意思,非java編寫,比如c/c++,一般用於操作底層的硬件。在java中通過本地方法接口也就是帶native修飾符的方法來調用本地方法。
java方法區中包含哪些內容,常量池中包含哪些內容
方法區里存儲着class文件的信息和動態常量池,class文件的信息包括類信息和靜態常量池。可以將類的信息是對class文件內容的一個框架,裏面具體的內容通過常量池來存儲。
動態常量池裡的內容除了是靜態常量池裡的內容外,還將靜態常量池裡的符號引用轉變為直接引用,而且動態常量池裡的內容是能動態添加的。例如調用String的intern方法就能將string的值添加到String常量池中,這裡String常量池是包含在動態常量池裡的,但在jdk1.8後,將String常量池放到了堆中。
Java內存中的棧,堆和方法區的用法有什麼不同
JAVA的JVM的內存可分為3個區:堆(heap)、棧(stack)和方法區(method)也叫靜態存儲區。
堆區:
存儲的全部是對象,每個對象都包含一個與之對應的class的信息。(class的目的是得到操作指令)
2.jvm只有一個堆區(heap)被所有線程共享,堆中不存放基本類型和對象引用,只存放對象本身
棧區:
每個線程包含一個棧區,棧中只保存基礎數據類型的對象和自定義對象的引用(不是對象),對象都存放在堆區中
2.每個棧中的數據(原始類型和對象引用)都是私有的,其他棧不能訪問。
3.棧分為3個部分:基本類型變量區、執行環境上下文、操作指令區(存放操作指令)。
方法區:
又叫靜態區,跟堆一樣,被所有的線程共享。方法區包含所有的class和static變量。
2.方法區中包含的都是在整個程序中永遠唯一的元素,如class,static變量。
jdk1.8關於方法區的變化
1、 java7之前,方法區位於永久代(PermGen),永久代和堆相互隔離,永久代的大小在啟動JVM時可以設置一個固定值,不可變;
2、 java7中,static變量從永久代移到堆中;
3、 java8中,取消永久代,方法存放於元空間(Metaspace),元空間仍然與堆不相連,但與堆共享物理內存,邏輯上可認為在堆中 ,但是實際上我們說的堆指的是用於存放java對象的那些空間。元空間並不在虛擬機中,而是使用本地內存
另外:
詳情請見—
JAVA中方法區是不是堆的一部分
方法區,又稱永久代(Permanent Generation),常稱為PermGen,位於非堆空間,又稱非堆區(Non-Heap space)。
方法區是被所有線程共享。
所有字段和方法位元組碼,以及一些特殊方法如構造函數,接口代碼也在此定義。
簡單說,所有定義的方法的信息都保存在該區域,此區屬於共享區間。
靜態變量 + 常量 + 類信息(構造方法/接口定義) + 運行時常量池存 在方法區中 。
但是, 實例變量 存在 堆內存 中,和方法區無關。
以上,只是邏輯上的定義。在HotSpot中,方法區僅僅只是邏輯上的獨立,實際上還是包含在Java堆中,也是就說,方式區在物理上屬於Java堆區中的一部分,而永久區(Permanent Generation)就是方法區的實現。
Java方法區和堆分別儲存什麼
靜態變量、常量在方法區,所有方法,包括靜態和非靜態的,也在方法區。堆儲存對象、數組、非靜態變量。
原創文章,作者:JHOZ,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/149553.html