熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

JAVA虛擬機實例學習筆記二

2022-06-13   來源: Java核心技術 

  數組
  
  數組也是類的對象具有相同類型和維數的數組屬於同一個類(不管長度只看維數)數組的長度屬於對象實例多維數組也是一維數組如二
  
  維數組即為一個一維數組該一維數組的每個元素是一個數組的引用數組和普通對象一樣也存儲在堆中
  數組名為數組的引用通過索引即數組標號來訪問數組內容
  
  異常
  
  在java棧幀的幀數據區內保存有針對該方法的異常表的引用異常表記載了該方法的字節碼(*class)受catch子句保護的范圍(即try子句裡的
  
  字節碼)當某個方法拋出異常時虛擬機在對應的異常表中尋找匹配的catch子句並將控制權交給catch子句中的代碼
  
  java執行引擎
  
  實現平台無關性以java方法幀裡的操作數棧為中心將局部變量數組當作cpu的寄存器每操作一個數據都要壓人操作數棧然後返回至局部
  
  變量區java虛擬機規定強類型轉換即低精度可以隱式轉換到高精度高精度必須強制轉換到低精度
  
  線程
  
  線程即存在於進程中的某個執行體
  每個線程必須遵守對象鎖定線程等待和通知
  對象鎖定使線程互斥的訪問對象資源等待和通知則是遵守線程合理調度以達到同一個目的java對象通過指令集達到上鎖目的同過繼承
  
  object類的wait()notify()notifyall()方法來等待和通知當某個線程調用某個對象的wait()方法時該線程被阻塞並加入到該對象的線
  
  程阻塞隊列中直到另一個線程調用同一對象的通知方法才能喚醒阻塞隊列中的線程
  
  常量池
  
  常量池用來存放類型的各種信息包括類型的各種直接常量和對其他類型字段方法的符號引用
  常量池分為兩種存儲在class字節碼中的常量池和存儲在方法區中的運行時常量池
  常量池以入口形式(類似於中斷向量表)出現每個入口都指向一個表表中存儲常量的信息但從常量池的入口的標志位就可以判斷對應的表
  
  中存儲的常量類型
  常量池入口以一個標志位開始該標志位指示該常量的類型每個入口對應一個表該表以符號_info結尾表中存放常量的壓縮形式
  常量池除了存放直接常量外還容納如下幾種符號引用
  類和接口的全限定名
  字段名稱和描述符(該描述符是一個指示字段類型的字符串字段是一個類或接口的類變量或實例變量)
  方法名稱和描述符(該描述符指示方法返回類型參數類型數量順序)
  
  運行時虛擬機用常量池的全限定名和方法字段的描述符來建立類與類的關系
  
  常量池僅僅是一個引用和描述符的集合並不接受任何賦值操作
  
  所有對象的創建方法和類變量的調用均要從常量池中獲取信息但實例變量的調用從堆裡獲得(猜想)
  
  符號引用是由虛擬機解析後得到具體的地址來使用
  
  常量池解析就是將常量池中的符號引用替換成直接引用
  
  當要使用某個類的方法或字段時首先從常量池中找到該方法或字段的符號引用然後進行解析找到其物理地址
  
  把代碼中出現的各種符號引用類與類的聯系進行常量池解析叫做動態連接
  
  常量池結構
  
  常量池由很多狠多的單元組成每一個單元都形如(入口|內容)訪問常量池單元時通過索引找到入口然後訪問其內容但有時單元的內容也
  
  可能是一個常量池入口(比如類或接口的常量池單元入口包含該類的符號引用即constant_class_info而內容則指向一個
  
  constant_utf_info的常量池單元該單元裡存放了該類的全限定名)而直接常量如intfloat等內容處就是常量的值
  
  方法區的結構
  
  方法區存儲所有關於類型接口的信息方法區包含
  
  常量池存儲類型的直接常量和所有的字段方法其他類型的符號引用(僅僅是引用並不存放具體信息)
  
  字段信息所有聲明的字段(包括字段名類型修飾符)
  
  方法信息所有定義的方法(包括方法名返回類型修飾符方法的字節碼方法棧幀的大小方法的異常)
  
  類變量信息虛擬機在方法區中為所有類變量分配空間以後的初始化賦值等操作也在方法區中進行以便為所有類實例共享
  
  為提高訪問速度虛擬機在方法區中為每個非抽象類設置了一個方法表該表是一個數組每個元素是一個方法的直接引用當類的對象調用
  
  方法時就在方法表中搜索(抽象類沒有實例所以不用調用方法所以沒有方法表)
  
  
  
  堆存放類的實例和數組(包括實例變量指向對應方法區中類數據的引用)
  
  一個例子
  
  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返回falsec==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指向的是同一個對象
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26064.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.