大家好,如果您還對字符串常量池和運行時常量池不太了解,沒有關系,今天就由本站為大家分享字符串常量池和運行時常量池的知識,包括java字符串常量池在堆還是方法區的問題都會給大家分析到,還望可以解決大家的問題,下面我們就開始吧!
7種常量元素是什么
礦物質含量在人體內大于0.01%的各種元素,稱為常量元素,包括鈣、磷、鉀、硫、氯、鎂等7種。
其實嬰兒所需的常量元素主要有鈣、磷、鎂、鉀、鈉、氯以及硫七種,它們在人體中都有很重要的作用。鈣是人體骨骼牙齒的重要組成成分,還參與神經和肌肉的正?;顒樱送膺€是人體眾多酶的激活劑
Java運行時區域,哪些區域是線程私有的哪些是共有的
JVM運行時數據區域大致可以分為:程序計數器、虛擬機棧、本地方法棧、堆區、元空間、運行時常量池、直接內存等區域;就是下面這個樣子的:
其中有些區域,隨著JDK版本的升級不斷調整,例如:
JDK1.6,字符串常量池位于永久代的運行時常量池中;
JDK1.7,字符串常量池從永久代剝離,放入了堆中;
JDK1.8,元空間取代了永久代,并且放入了本地內存(Nativememory)中。
以上幾個區域,按照線程公有還是私有可分為:
線程隔離:程序計數器、虛擬機棧、本地方法棧;
線程公有:其它的都是線程共享的區域。
線程私有1.程序計數器
一個CPU在某個時間點,只能做一件事情,在多線程的情況下,CPU運行時間被劃分成若干個時間片,分配給各個線程執行;
程序計數器的作用就是記錄當前線程執行的位置,當線程被切換回來的時候,能夠找到該線程上次運行到哪兒了;所以程序計數器一定是線程隔離的。
2.虛擬機棧和本地方法棧
虛擬機棧:每個Java方法在執行的同時,會創建一個棧幀,用于存儲局部變量表、操作數棧、常量池引用等信息;方法的調用過程,就是一個棧幀在Java虛擬機棧中入棧和出棧的過程;
本地方法棧:和虛擬機棧很類似,區別在于虛擬機棧為Java方法服務,本地方法棧為Native方法服務;其中Native方法可以看做用其它語言(C、C++或匯編語言等)編寫的方法;
HotSpot虛擬機就選擇了將虛擬機棧和本地方法棧合并在了一起;
為了保證線程中的局部變量不被別的線程訪問到,所以虛擬機棧和本地方法棧是線程隔離的。線程公有1.堆區
對于堆棧的區別總結一句話:堆中存對象,棧中存基本數據類型和堆中對象的引用;一個對象的大小是可以動態變化的,而引用是固定大小的。
這么看就容易理解堆為什么是線程公有的了,省地兒啊。
2.元空間區/方法區
方法區用于存放已被加載的類信息、常量、靜態變量、即編譯器編譯后的代碼等。
還有要注意的一點:方法區是JVM的規范,在JDK1.8之前,方法區的實現是永久代;從JDK1.8開始JVM移除了永久代,使用本地內存來存儲元數據并稱之為:元空間(Metaspace)。
3.運行時常量池
Class文件中的常量池,會在類加載后被放入這個區域。
另外在JDK1.7之前,字符串常量池就在運行時常量池中,后來字符串常量池放入了堆中,而運行時常量池仍然在方法區(元空間區)中。
有興趣的朋友可以自己測試一下,以死循環方式創建字符串常量,JDK1.6會報永久代OOM;JDK1.7會報堆區OOM。
4.直接內存
也叫做堆外內存,并不是虛擬機運行時數據區的一部分,也不是Java虛擬機規范中定義的內存區域。
JDK1.4加入的NIO類,引入了一種基于通道(Channel)與緩沖區(Buffer)的I/O方式,它可以使用native函數庫直接分配堆外內存,然后通過堆上的DirectByteBuffer對象對這塊內存進行引用和操作。
簡單來說,直接內存就是JVM內存之外有一塊內存區域,我們通過堆上的一個對象可以操作它;具體等講到NIO部分的時候,再回來加深理解。
我將持續分享Java開發、架構設計、程序員職業發展等方面的見解,希望能得到你的關注;關注我后,可私信發送數字【1】,獲取海量學習資料。文章分享結束,字符串常量池和運行時常量池和java字符串常量池在堆還是方法區的答案你都知道了嗎?歡迎再次光臨本站哦!