成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

淺析Java虛擬機的工作流程

開發 后端
本文將介紹Java虛擬機的工作流程,Java虛擬機(JVM)是Java Virtual Machine的縮寫,它是一個虛構出來的計算機,是通過在實際的計算機上仿真模擬各種計算機功能模擬來實現的。

首先給一個簡單的java示例,源代碼如下:

  1. public class Main {  
  2. private static int size=1;  
  3. public static void main(String args[]) {   
  4. User u = new User();  
  5. u.setName("李文水");  
  6. u.setPwd("159");  
  7. String name = u.getName();  
  8. String pwd = u.getPwd();  
  9. u = null;  
  10. }  
  11. }  
  12. public class User {  
  13. private String name;  
  14. private String pwd;  
  15. public String getName() {  
  16. return name;  
  17. }  
  18. public void setName(String name) {  
  19. this.name = name;  
  20. }  
  21. public String getPwd() {  
  22. return pwd;  
  23. }  
  24. public void setPwd(String pwd) {  
  25. this.pwd = pwd;  
  26. }  

現在假設這兩個java源文件已經被編譯成了CLASS文件了,我們來看看java虛擬機怎么執行的。

Java虛擬機工作流程:

1.裝載

描敘:Java虛擬機裝載指定的CLASS文件,

結果:形成這個CLASS類的實例對象

過程:java虛擬機使用類裝載器定位到相應的CLASS文件,然后讀取這個CLASS文件(一個線性二進制數據流),將它傳入java虛擬機中。緊接著虛擬機提取其中的類型信息。比如:該類的類名,方法名,變量名,修飾符,方法的返回類型等等。還有一個重要的東西就是常量池。(常量池保存了該類型的所有常量,包括直接常量和對其他類型,字段,方法的符號引用)將這些信息保存在一個叫做方法區的地方。最終形成CLASS類的實例,這個實例存放在內存的堆區。它成為了java程序與內部數據結構之間的接口,程序要訪問該類型的信息,程序就調用該類型對應的CLASS實例對象的方法。簡而言之:這個過程就是把一個類型的二進制數據解析為方法區中的內部數據結構,并在堆上建立一個CLASS對象的過程。

示例:裝載Main類

Java虛擬機讀取Main類的CLASS文件,生產對應的java.lang.Class類的實例,讀取其中的類型信息,比如修飾符private,public,static,另外變量 size,name,pwd,User(User即為一個引用)共同構成了這個類的常量池。將這些信息保存在方法區,

2.連接

描述:驗證,準備,解析(可選)

結果:這個類型是正確的。(這里不知道該怎么描述)

過程:

1)驗證:確定類型符合java語言的語義,比如:final類不能有子類,final方法不能被覆蓋,確保在類型和超類型之間沒有不兼容的方法聲明(比如兩個方法擁有同樣的名字,參數完全相同,但返回類型不同)。

2)準備:java虛擬機為類變量分配內存,設置默認值

3)解析:在類型的常量池中尋找類,接口,字段和方法的符合引用把這些符號引用替換成直接引用的過程。

示例: 連接Main類

Java虛擬機為size分配內存,并賦默認值0.找到常量池中User類的引用,如果User類還沒有被裝載,則裝載并且連接該類,然后將常量池中對User類的引用替換為直接引用。在此時User類并不會被初始化,因為還沒有用它。

3.初始化

描述:初始化一些靜態變量

結果:這個類型可以使用了

過程:可能會調用()方法,(這個方法只能夠由java虛擬機調用)來初始化該類的靜態變量。在調用這個方法前,必須確認該類的超類的() 方法已經被調用。

示例:初始化Main類

Java虛擬機將Main類的靜態變量賦值為1.

4.使用(執行該類代碼了)

1.User u = new User();(存放在內存的堆區)

創建了一個User類實例,實際上是通過這個類的CLASS實例實例化的。方法如下:

User u=(User)Class.forName("User").newInstance();

為了方便,用C代替Class.forName("User")

2.u.setName("李文水"); u.setPwd("159");

調用該類的方法,為該類的變量賦值,Java虛擬機內部調用是這樣的,通過方法區找到該方法,利用CLASS實例的如下方法調用:

c.getMethod("setName").invoke(u,"李文水");

3.String name = u.getName(); String pwd = u.getPwd();

與第二步類似,不同的是將取得的值分別賦給了變量name和pwd。關鍵是這個值保存在哪里?和實例對象一樣,存放在堆區。這個時候我應該可以看出CLASS實例的作用了,它就是起個中間作用,將程序中的調用反應到堆區上數據的變化。

4.u = null;


這個步驟寫出來的目的是了解一下Java虛擬機垃圾回收機制。(沒有什么實際意義)

Java虛擬機內部會根據一種規則(這個對象是否可以觸及)來判斷這兩個類是否可以回收了?具體形式如下:

具體形式

當執行 u = null;時這條線就被斬斷了,因此User實例就不可以觸及了,所以java虛擬機就可以回收這個User實例了。

以上是我自己通過看《深入java虛擬機》這本書對java虛擬機的了解,由于自己的表達能力不是很強,大家若有什么疑問。希望能與我一起討論下!

【編輯推薦】

  1. 共同學習Java虛擬機
  2. 如何分析Java虛擬機死鎖
  3. Java虛擬機內部構成淺析
  4. 淺談Java線程的生命周期
  5. 關于Java繼承的一些復習
責任編輯:彭凡 來源: javaeye
相關推薦

2010-06-24 16:40:16

Bittorrent協

2010-02-24 10:39:28

Python虛擬機

2022-10-26 08:00:43

Activiti工作流BPM

2009-12-14 15:01:31

架構師

2010-05-26 15:57:21

IPv6 ACL

2011-03-31 10:54:01

Cacti工作流程

2010-07-13 16:21:22

FIX協議

2010-06-12 17:44:19

ARP協議

2010-09-27 10:19:09

DHCP工作流程

2009-06-05 10:26:05

struts工作流程

2022-11-02 15:11:44

LightHouseChrome插件

2009-06-18 13:51:07

Java虛擬機

2013-03-18 16:32:01

網絡虛擬化虛擬機技術網管集中工作

2012-05-18 10:22:23

2010-06-23 14:46:54

DHCP協議

2018-06-19 15:39:21

HeapJava虛擬機

2011-06-22 13:35:55

JVM

2020-01-17 10:52:37

無服務器容器技術

2009-08-21 19:08:45

Windows 7虛擬機安裝

2010-07-28 17:19:28

ICMP協議
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美激情一区二区三级高清视频 | 亚洲网站在线观看 | 日本免费小视频 | 日韩成人免费av | 91性高湖久久久久久久久_久久99 | 久久精品亚洲国产 | 国产精品久久久久久久久久久久午夜片 | 国产免费一区 | www.伊人.com| 欧美色999 | 亚洲高清成人在线 | 99免费精品视频 | 中文字幕av色 | 免费在线黄 | 亚洲一区综合 | 国产专区视频 | 精品国产乱码久久久久久影片 | 久久免费观看视频 | 作爱视频免费看 | 国产精品毛片 | 亚洲一区二区不卡在线观看 | 99re6热在线精品视频播放 | 极品粉嫩国产48尤物在线播放 | 国产一区二区精华 | 日韩黄色小视频 | 亚洲看片网站 | 国产一级在线观看 | 一区二区三区在线播放 | 亚洲精品久久久久avwww潮水 | 成人综合视频在线观看 | 天天综合干 | 老司机深夜福利网站 | 99久久精品免费看国产免费软件 | 国产精品福利在线 | 精品久久久久久久人人人人传媒 | 激情欧美日韩一区二区 | 蜜桃视频在线观看免费视频网站www | 精品福利在线 | 久久精品亚洲精品国产欧美 | 欧美日本亚洲 | 精品国产一区二区三区性色av |