java虛擬機器學習筆記2

來源:互聯網
上載者:User
筆記
11.數組數組也是類的對象。具有相同類型和維數的數組屬於同一個類(不管長度只看維數)。數組的長度屬於對象執行個體。多維陣列也是一維數組。如二

維數組,即為一個一維數組,該一維數組的每個元素是一個數組的引用。數組和普通對象一樣也儲存在堆中。數組名為數組的引用,通過索引即數組標號來訪問數組內容。

12.異常在java棧幀的幀資料區內儲存有針對該方法的異常表的引用。異常表記載了該方法的位元組碼(*.class)受catch子句保護的範圍(即try子句裡的

位元組碼)。當某個方法拋出異常時,虛擬機器在對應的異常表中尋找匹配的catch子句,並將控制權交給catch子句中的代碼。

13.java執行引擎實現平台無關性,以java方法幀裡的運算元棧為中心,將局部變數數組當作cpu的寄存器。每操作一個資料都要壓人運算元棧,然後返回至局部

變數區。java虛擬機器規定強型別轉換,即低精度可以隱式轉換到高精度,高精度必須強制轉換到低精度。

14.線程線程即存在於進程中的某個執行體。每個線程必須遵守對象鎖定,線程等待和通知。對象鎖定使線程互斥的訪問對象資源。等待和通知則是遵守線程合理調度以達到同一個目的。java對象通過指令集達到上鎖目的,同過繼承

object類的wait(),notify(),notifyall()方法來等待和通知。當某個線程調用某個對象的wait()方法時,該線程被阻塞,並加入到該對象的線

程阻塞隊列中,直到另一個線程調用同一對象的通知方法,才能喚醒阻塞隊列中的線程。

15.常量池常量池用來存放類型的各種資訊,包括類型的各種直接常量,和對其他類型,欄位,方法的符號引用。常量池分為兩種,儲存在.class位元組碼中的常量池和儲存在方法區中的運行時常量池。常量池以入口形式(類似於中斷向量表)出現,每個入口都指向一個表,表中儲存常量的資訊。但從常量池的入口的標誌位就可以判斷對應的表

中儲存的常量類型。常量池入口以一個標誌位開始,該標誌位指示該常量的類型。每個入口對應一個表,該表以符號_info結尾,表中存放常量的壓縮形式。常量池除了存放直接常量外還容納如下幾種符號引用:類和介面的全限定名。欄位名稱和描述符(該描述符是一個指示欄位類型的字串。欄位是一個類或介面的類變數或執行個體變數)。方法名稱和描述符(該描述符指示方法傳回型別,參數類型,數量,順序)。

運行時,虛擬機器用常量池的全限定名和方法,欄位的描述符來建立類與類的關係。

常量池僅僅是一個引用和描述符的集合,並不接受任何賦值操作。

所有對象的建立,方法和類變數的調用均要從常量池中擷取資訊,但執行個體變數的調用從堆裡獲得。(猜想)

符號引用是由虛擬機器解析後得到具體的地址來使用。

常量池解析就是將常量池中的符號引用替換成直接引用。

當要使用某個類的方法或欄位時,首先從常量池中找到該方法或欄位的符號引用,然後進行解析,找到其物理地址。

把代碼中出現的各種符號引用,類與類的聯絡,進行常量池解析,叫做動態串連。

16.常量池結構常量池由很多狠多的單元組成,每一個單元都形如(入口|內容),訪問常量池單元時通過索引找到入口,然後訪問其內容。但有時單元的內容也

可能是一個常量池入口(比如類或介面的常量池單元,入口包含該類的符號引用即constant_class_info,而內容則指向一個

constant_utf8_info的常量池單元,該單元裡存放了該類的全限定名)。而直接常量如int,float等,內容處就是常量的值。

17.方法區的結構方法區儲存所有關於類型,介面的資訊。方法區包含:

常量池:儲存類型的直接常量和所有的欄位,方法,其他類型的符號引用(僅僅是引用,並不存放具體資訊)。

欄位資訊:所有聲明的欄位(包括欄位名,類型,修飾符)。

方法資訊:所有定義的方法(包括方法名,傳回型別,修飾符,方法的位元組碼,方法棧幀的大小,方法的異常)。

類變數資訊:虛擬機器在方法區中為所有類變數分配空間,以後的初始化,賦值等操作也在方法區中進行,以便為所有類執行個體共用。

為提高訪問速度,虛擬機器在方法區中為每個非抽象類別設定了一個方法表,該表是一個數組,每個元素是一個方法的直接引用。當類的對象調用

方法時,就在方法表中搜尋(抽象類別沒有執行個體,所以不用調用方法,所以沒有方法表)。

18.堆堆存放類的執行個體和數組(包括執行個體變數,指向對應方法區中類資料的引用)。

19.一個例子class test{public static void main(string args[]){string a=new string("hello");string b=new string("hello");string c="hello";string d="hello";}}則a==b返回false,c==d返回ture。因為:==比較雙方是否是同一個對象。

首先:string a=new string("hello")string b=new string("hello")a和b分別各自建立了hello的對象和引用變數,即在堆中有兩個hello,他們各自的引用是a和b。

而:string c="hello"string d="hello"先建立一個字串類執行個體hello,再建立兩個字串引用變數c和d,然後讓c和d都指向開始建立的hello執行個體。因此c和d指向的是同一個對象。


相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。