java內存區域及靜態常量池、運行時常量池介紹

java內存區域介紹

我們先來介紹下虛擬機運行時數據區的結構:

我們項目中的每一個線程在運行時,都會有擁有自己獨立的棧數據和程序計數器。程序計數器可以看作字節碼命令的指示器,記錄了下個需要執行的字節碼指令,棧數據主要分為本地方法棧和java虛擬機棧。java虛擬機棧就是用來處理我們程序中代碼生成的字節碼的。

我們程序中的每個方法在執行時都會被分配給一個虛擬機棧幀,棧幀中包含局部變量表和操作數棧以及返回地址等,用來執行該方法生成的字節碼。我們的java程序在編譯期間編譯器會自動幫我們添加一個默認參數,這個參數就是該方法所屬類的引用,也就是我們開發中經常會用的this。this持有方法區中類對象的引用(注意類對象是被放在方法區的,而其他對象都是放在堆中的)。類對象中包含了類的基本信息,包括全限定名、簡單名、字段列表、方法列表等等,而這些屬性的值全部都被保存在常量池中。常量池又可以分為靜態常量池和運行時常量池,接下來我們介紹常量池。

靜態常量池和運行時常量池介紹

我們的java程序在編寫完成時是以java文件的形式存在的,在完成編譯后變成了class文件。如果大家比較了解class文件的話,應該會知道class文件中最重要的是常量池,類的所有屬性,包括字段名、方法名等等的值都存儲在class文件的常量池中,這里的常量池就是我們所說的靜態常量池。這時類屬性對class文件常量池中值的引用被稱為符號引用,因為這時常量池中的值仍然僅僅是符號,不是具體的內存地址。符號引用到內存地址引用的轉換要到運行期才會發生,所以我們稱java程序是動態鏈接的。

當我們class文件被加載到內存中時,內存中同樣存在一個常量池,這個常量池我們通常稱為運行時常量池。但是這里的運行時常量池僅僅是一個泛稱,而并不是說有這么一個大池子,實際上運行時常量池是字符串常量池、數字類型常量池等數據結構的統稱。這里我們以字符串常量池舉個?來說明靜態常量池到運行時常量池的轉變過程。虛擬機在將class文件加載到內存的過程中會先到class文件的常量池中尋找字符串類型的常量數據,找到后到內存中的運行時字符串常量池中尋找是否有相同的字符,若沒有就在堆中創建一個字符串對象,并且在字符串常量池添加這個字符串的引用,同時也會將class中所有原本的引用全部都改成新的引用。字符串常量的使用能夠大幅度的提升對象的利用率,減少程序中不必要的開銷。

?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/451024.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/451024.shtml
英文地址,請注明出處:http://en.pswp.cn/news/451024.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

狗窩里的小日子- 6 ...

來,把平時作的菜菜整理下: 61. 62. 63. 64. 65. 66. 67. 68. 69. 70.

數據庫常見面試題總結

參考如下: 數據庫常見面試題(開發者篇) 數據庫優化 SQL數據庫面試題及答案 常見面試題整理--數據庫篇轉載于:https://www.cnblogs.com/threetop/p/9425172.html

京東商城上市帶來的利與益

有人說2012是大選年,而對于互聯網行業來說,不如說是上市年。繼全球第一的社交網站Facebook上市之后,中國最大的電子商城京東商城也要緊鑼密鼓的進行IPO了。筆者不分析京東IPO對電商行業的影響、不分析京東后IPO那些二三線電商怎么著急、不談電…

狗窩里的小日子- 7 ...

來,把平時作的菜菜整理下: 71. 72. 73. 74. 75. 76. 77. 78. 79. 80.

[轉]CNN目標檢測(一):Faster RCNN詳解

https://blog.csdn.net/a8039974/article/details/77592389 Faster RCNN github : https://github.com/rbgirshick/py-faster-rcnn Faster RCNN paper : https://arxiv.org/abs/1506.01497 Bound box regression詳解 : http://download.csdn.net/download/zy1034092330/9940097…

Class.forName和ClassLoader

(1)ClassLoader是用來加載類數據的(加載的方式由具體的加載器決定)。類加載器根據類的全限定名加載類的二進制字節流,然后將字節流轉換成jvm方法區中的運行時數據結構,并在方法區生成一個代表該類的Class對…

狗窩里的小日子- 8 ...

來,把平時作的菜菜整理下: 81. 82. 83. 84. 85. 86. 87. 88.

PHPSTORM破解版激活方式方法

方法一. 通過Licence Server 激活PHPStorm(快速)方法原理是通過搭建服務器激活,不過網上有許多搭建好的。http://idea.goxz.gqhttp://v2mc.net:1017http://idea.imsxm.com(2016版)http://idea.ibdyr.com注:不一定長期有…

BZOJ1911 特別行動隊

目錄 BZOJ1911 特別行動隊題解codeBZOJ1911 特別行動隊 題目傳送門 題解 典型的斜率優化\(Dp\)。首先如果我們記\(sum[i]\)表示前\(i\)個士兵的戰斗力之和,那么我們比較容易的可以得出\(O(n^2)\)的\(Dp\):\…

硅谷創業者中被遮蔽的“中國現象”

摘要:他們關心互聯網和移動,但更關心公共設施的信息化、環境污染和氣候變暖、清潔能源的利用,以及農業和食物的改良。但至少目前看上去,他們贏得的來自硅谷的學術機構、風險投資界的認可與尊敬,似乎要更多。 他們關心互…

【模式識別與機器學習】——3.9勢函數法:一種確定性的非線性分類方法

目的 用勢函數的概念來確定判別函數和劃分類別界面。 基本思想 假設要劃分屬于兩種類別ω1和ω2的模式樣本,這些樣本可看成是分布在n維模式空間中的點xk。 把屬于ω1的點比擬為某種能源點,在點上,電位達到峰值。 隨著與該點距離的增大&a…

超詳細 - SVN下載安裝及使用教程

SVN簡介: 為什么要使用SVN? 程序員在編寫程序的過程中,每個程序員都會生成很多不同的版本,這就需要程序員有效的管理代碼,在需要的時候可以迅速,準確取出相應的版本。 Subversion是什么? 它是一…

TW實習日記:第16天

前端的樣式bug實在是太太太莫名其妙了,尤其是封裝好的組件,一層套一層的,根本不知道是哪一層出了問題...除了改bug就是做新功能,真想吐槽一下這個項目的留言板,根本沒人會用吧...這功能實在是太老舊了... 感覺每一天都…

重載與重寫(overload and override)

在java編程中經常會遇到重載和重寫,剛接觸java的時候對這對概念比較懵比,也不能理解其中的區別,后來在逐漸的學習中更加深刻的理解了其中的原理。哎,說來還是基礎知識學的不扎實,這些都是大學期間偷懶欠下的帳。 &…

洛谷P4114 Qtree1(樹鏈剖分+線段樹)

傳送門 LCT秒天秒地用什么樹剖 這題可以算是樹剖的比較裸的題目了 把每一條邊的權值下放到他兩邊的點中深度較深的那個 然后直接用樹剖線段樹帶進去亂搞就可以了 1 //minamoto2 #include<bits/stdc.h>3 using namespace std;4 template<class T>inline bool cmax(T…

什么是CDN ,CDN的作用

轉自&#xff1a;https://baike.baidu.com/item/CDN/420951?fraladdin 簡介 CDN是構建在網絡之上的內容分發網絡&#xff0c;依靠部署在各地的邊緣服務器&#xff0c;通過中心平臺的負載均衡、內容分發、調度等功能模塊&#xff0c;使用戶就近獲取所需內容&#xff0c;降低網…

docker 中不能用vim編輯文件

2019獨角獸企業重金招聘Python工程師標準>>> docker 中不能用vim編輯文件 2017年08月28日 16:54:29 閱讀數&#xff1a;2061 更新來源 apt-get update 1安裝vim apt-get install -y vim 轉載于:https://my.oschina.net/u/3367404/blog/1923901

使用final修飾局部變量???

在編程中我們偶爾會看到如下的代碼&#xff1a; public void foo(final int arg){final int localData 0;// ...}以及與之相似的代碼 public void foo(int arg){int localData 0;// ...}這兩段代碼的主要區別就是&#xff1a;局部變量是否使用了final關鍵字修飾。有同學可能會…

視頻編解碼概述

視頻編解碼概述 1. 常用的基本知識 基本概念 編解碼 編解碼器&#xff08;codec&#xff09;指的是一個能夠對一個信號或者一個數據流進行變換的設備或者程序。這里指的變換既包括將信號或者數據流進行編碼&#xff08;通常是為了傳輸、存儲或者加密&#xff09;或者提取得到…

洛谷 2759 奇怪的函數

【題解】 取個對數然后二分即可。對于一個數x&#xff0c;x^x的位數就是(int)(lg(x)*x1). 1 #include<cstdio>2 #include<cstring>3 #include<algorithm>4 #include<cmath>5 #define LL long long6 #define rg register7 #define N 2000108 using name…