java原理圖
㈠ java虛擬機工作原理圖解
Java虛擬機
一、什麼是Java虛擬機
Java虛擬機是一個想像中的機器,在實際的計算機上通過軟體模擬來實現。Java虛擬機有自己想像中的硬體,如處理器、堆棧、寄存器等,還具有相應的指令系統。
1.為什麼要使用Java虛擬機
Java語言的一個非常重要的特點就是與平台的無關性。而使用Java虛擬機是實現這一特點的關鍵。一般的高級語言如果要在不同的平台上運行,至少需要編譯成不同的目標代碼。而引入Java語言虛擬機後,Java語言在不同平台上運行時不需要重新編譯。Java語言使用模式Java虛擬機屏蔽了與具體平台相關的信息,使得Java語言編譯程序只需生成在Java虛擬機上運行的目標代碼(位元組碼),就可以在多種平台上不加修改地運行。Java虛擬機在執行位元組碼時,把位元組碼解釋成具體平台上的機器指令執行。
2.誰需要了解Java虛擬機
Java虛擬機是Java語言底層實現的基礎,對Java語言感興趣的人都應對Java虛擬機有個大概的了解。這有助於理解Java語言的一些性質,也有助於使用Java語言。對於要在特定平台上實現Java虛擬機的軟體人員,Java語言的編譯器作者以及要用硬體晶元實現Java虛擬機的人來說,則必須深刻理解Java虛擬機的規范。另外,如果你想擴展Java語言,或是把其它語言編譯成Java語言的位元組碼,你也需要深入地了解Java虛擬機。
3.Java虛擬機支持的數據類型
Java虛擬機支持Java語言的基本數據類型如下:
byte://1位元組有符號整數的補碼
short://2位元組有符號整數的補碼
int://4位元組有符號整數的補碼
long://8位元組有符號整數的補碼
float://4位元組IEEE754單精度浮點數
double://8位元組IEEE754雙精度浮點數
char://2位元組無符號Unicode字元
幾乎所有的Java類型檢查都是在編譯時完成的。上面列出的原始數據類型的數據在Java執行時不需要用硬體標記。*作這些原始數據類型數據的位元組碼(指令)本身就已經指出了*作數的數據類型,例如iadd、ladd、fadd和dadd指令都是把兩個數相加,其*作數類型別是int、long、 float和double。虛擬機沒有給boolean(布爾)類型設置單獨的指令。boolean型的數據是由integer指令,包括integer 返回來處理的。boolean型的數組則是用byte數組來處理的。虛擬機使用IEEE754格式的浮點數。不支持IEEE格式的較舊的計算機,在運行 Java數值計算程序時,可能會非常慢。
虛擬機支持的其它數據類型包括:
object//對一個Javaobject(對象)的4位元組引用
returnAddress//4位元組,用於jsr/ret/jsr-w/ret-w指令
注:Java數組被當作object處理。
虛擬機的規范對於object內部的結構沒有任何特殊的要求。在Sun公司的實現中,對object的引用是一個句柄,其中包含一對指針:一個指針指向該object的方法表,另一個指向該object的數據。用Java虛擬機的位元組碼表示的程序應該遵守類型規定。Java虛擬機的實現應拒絕執行違反了類型規定的位元組碼程序。Java虛擬機由於位元組碼定義的限制似乎只能運行於32位地址空間的機器上。但是可以創建一個Java虛擬機,它自動地把位元組碼轉換成64位的形式。從Java虛擬機支持的數據類型可以看出,Java對數據類型的內部格式進行了嚴格規定,這樣使得各種Java虛擬機的實現對數據的解釋是相同的,從而保證了Java的與平台無關性和可
移植性。
二、Java虛擬機體系結構
Java虛擬機由五個部分組成:一組指令集、一組寄存器、一個棧、一個無用單元收集堆(Garbage-collected-heap)、一個方法區域。這五部分是Java虛擬機的邏輯成份,不依賴任何實現技術或組織方式,但它們的功能必須在真實機器上以某種方式實現。
1.Java指令集
Java虛擬機支持大約248個位元組碼。每個位元組碼執行一種基本的CPU運算,例如,把一個整數加到寄存器,子程序轉移等。Java指令集相當於Java程序的匯編語言。
Java指令集中的指令包含一個單位元組的*作符,用於指定要執行的*作,還有0個或多個*作數,提供*作所需的參數或數據。許多指令沒有*作數,僅由一個單位元組的*作符構成。 虛擬機的內層循環的執行過程如下:
do{
取一個*作符位元組;
根據*作符的值執行一個動作;
}while(程序未結束)
由於指令系統的簡單性,使得虛擬機執行的過程十分簡單,從而有利於提高執行的效率。指令中*作數的數量和大小是由*作符決定的。如果*作數比一個位元組大,那麼它存儲的順序是高位位元組優先。例如,一個16位的參數存放時佔用兩個位元組,其值為:
第一個位元組*256+第二個位元組位元組碼指令流一般只是位元組對齊的。指令tableswitch和lookup是例外,在這兩條指令內部要求強制的4位元組邊界對齊。
2.寄存器
Java虛擬機的寄存器用於保存機器的運行狀態,與微處理器中的某些專用寄存器類似。
Java虛擬機的寄存器有四種:
pc:Java程序計數器。
optop:指向*作數棧頂端的指針。
frame:指向當前執行方法的執行環境的指針。
vars:指向當前執行方法的局部變數區第一個變數的指針。
Java虛擬機
Java虛擬機是棧式的,它不定義或使用寄存器來傳遞或接受參數,其目的是為了保證指令集的簡潔性和實現時的高效性(特別是對於寄存器數目不多的處理器)。
所有寄存器都是32位的。
3.棧
Java虛擬機的棧有三個區域:局部變數區、運行環境區、*作數區。
(1)局部變數區 每個Java方法使用一個固定大小的局部變數集。它們按照與vars寄存器的字偏移量來定址。局部變數都是32位的。長整數和雙精度浮點數占據了兩個局部變數的空間,卻按照第一個局部變數的索引來定址。(例如,一個具有索引n的局部變數,如果是一個雙精度浮點數,那麼它實際占據了索引n和n+1所代表的存儲空間。)虛擬機規范並不要求在局部變數中的64位的值是64位對齊的。虛擬機提供了把局部變數中的值裝載到*作數棧的指令, 也提供了把*作數棧中的值寫入局部變數的指令。
(2)運行環境區 在運行環境中包含的信息用於動態鏈接,正常的方法返回以及異常傳播。
·動態鏈接
運行環境包括對指向當前類和當前方法的解釋器符號表的指針,用於支持方法代碼的動態鏈接。方法的class文件代碼在引用要調用的方法和要訪問的變數時使用符號。動態鏈接把符號形式的方法調用翻譯成實際方法調用,裝載必要的類以解釋還沒有定義的符號,並把變數訪問翻譯成與這些變數運行時的存儲結構相應的偏移地址。動態鏈接方法和變數使得方法中使用的其它類的變化不會影響到本程序的代碼。
·正常的方法返回
如果當前方法正常地結束了,在執行了一條具有正確類型的返回指令時,調用的方法會得到一個返回值。執行環境在正常返回的情況下用於恢復調用者的寄存器,並把調用者的程序計數器增加一個恰當的數值,以跳過已執行過的方法調用指令,然後在調用者的執行環境中繼續執行下去。
·異常和錯誤傳播
異常情況在Java中被稱作Error(錯誤)或Exception(異常),是Throwable類的子類,在程序中的原因是:①動態鏈接錯,如無法找到所需的class文件。②運行時錯,如對一個空指針的引用
·程序使用了throw語句。
當異常發生時,Java虛擬機採取如下措施:
·檢查與當前方法相聯系的catch子句表。每個catch子句包含其有效指令范圍,能夠處理的異常類型,以及處理異常的代碼塊地址。
·與異常相匹配的catch子句應該符合下面的條件:造成異常的指令在其指令范圍之內,發生的異常類型是其能處理的異常類型的子類型。如果找到了匹配的catch子句,那麼系統轉移到指定的異常處理塊處執行;如果沒有找到異常處理塊,重復尋找匹配的catch子句的過程,直到當前方法的所有嵌套的 catch子句都被檢查過。
·由於虛擬機從第一個匹配的catch子句處繼續執行,所以catch子句表中的順序是很重要的。因為Java代碼是結構化的,因此總可以把某個方法的所有的異常處理器都按序排列到一個表中,對任意可能的程序計數器的值,都可以用線性的順序找到合適的異常處理塊,以處理在該程序計數器值下發生的異常情況。
·如果找不到匹配的catch子句,那麼當前方法得到一個"未截獲異常"的結果並返回到當前方法的調用者,好像異常剛剛在其調用者中發生一樣。如果在調用者中仍然沒有找到相應的異常處理塊,那麼這種錯誤傳播將被繼續下去。如果錯誤被傳播到最頂層,那麼系統將調用一個預設的異常處理塊。
(3)*作數棧區 機器指令只從*作數棧中取*作數,對它們進行*作,並把結果返回到棧中。選擇棧結構的原因是:在只有少量寄存器或非通用寄存器的機器(如Intel486)上,也能夠高效地模擬虛擬機的行為。*作數棧是32位的。它用於給方法傳遞參數,並從方法接收結果,也用於支持*作的參數,並保存*作的結果。例如,iadd指令將兩個整數相加。相加的兩個整數應該是*作數棧頂的兩個字。這兩個字是由先前的指令壓進堆棧的。這兩個整數將從堆棧彈出、相加,並把結果壓回到*作數棧中。
每個原始數據類型都有專門的指令對它們進行必須的*作。每個*作數在棧中需要一個存儲位置,除了long和double型,它們需要兩個位置。* 作數只能被適用於其類型的*作符所*作。例如,壓入兩個int類型的數,如果把它們當作是一個long類型的數則是非法的。在Sun的虛擬機實現中,這個限制由位元組碼驗證器強制實行。但是,有少數*作(*作符pe和swap),用於對運行時數據區進行*作時是不考慮類型的。
4.無用單元收集堆
Java的堆是一個運行時數據區,類的實例(對象)從中分配空間。Java語言具有無用單元收集能力:它不給程序員顯式釋放對象的能力。Java不規定具體使用的無用單元收集演算法,可以根據系統的需求使用各種各樣的演算法。
5.方法區
方法區與傳統語言中的編譯後代碼或是Unix進程中的正文段類似。它保存方法代碼(編譯後的java代碼)和符號表。在當前的Java實現中,方法代碼不包括在無用單元收集堆中,但計劃在將來的版本中實現。每個類文件包含了一個Java類或一個Java界面的編譯後的代碼。可以說類文件是Java 語言的執行代碼文件。為了保證類文件的平台無關性,Java虛擬機規范中對類文件的格式也作了詳細的說明。其具體細節請參考Sun公司的Java虛擬機規范。
內容來源於網上。
㈡ java的跨平台工作原理
首先我們要理解什麼是跨平台,所謂的跨平台就是JAVA寫的一份代碼可以在任意的操作系統平台上運行。
為什麼跨平台會成為一個問題呢?因為每一個操作系統平台支持不同的指令集我們所寫的代碼經過編譯之後只能適用於一個平台,換一個平台就不支持了。而JAVA完美的解決了這個問題,JAVA是如何做到這一點的呢?在上圖中我們可以看到JAVA代碼執行的流程。
JAVA源代碼->JAVA位元組碼->JVM解釋執行
我們寫的JAVA源代碼會被編譯為位元組碼,然後被JVM虛擬機解釋執行,我們可以看到JVM虛擬機在跨平台的過程中發揮了重要的作用,就是由它解釋位元組碼並執行的,對應於每一個平台都有一個JVM虛擬機,而位元組碼只有一份,windows的JVM虛擬機可以將位元組碼解釋為能在windows平台上執行的指令並執行,Linux的JVM虛擬機可以將位元組碼解釋為能在Linux平台上執行的指令並執行,他們執行的位元組碼都是同一份。這樣就實現了跨平台。
㈢ java servlet的工作原理是什麼
配置:編輯好的servlet源文件並不能響應用戶請求,還必須將其編譯成class文件,將編譯好的class文件放到WEB-INF/classes路徑下,如果servlet有包,則還需要將class文件放到包路徑下。
2.運行原理:當Web伺服器接收到一個HTTP請求時,它會先判斷請求內容——如果是靜態網頁數據,Web伺服器將會自行處理,然後產生響應信息;如果牽涉到動態數據,Web伺服器會將請求轉交給Servlet容器。此時Servlet容器會找到對應的處理該請求的Servlet實例來處理,結果會送回W
3.用戶請求一個Servlet,Servlet容器自動構建請求和響應對象,然後執行Servlet的service()方法,該方法會接收請求和響應對象,通過響應對象將處理結果發送給用戶。
4.servlet 編程,需要引用以下兩個類和介面:javax.servlet 和 javax.servlet.http,在這些類和介面中,javax.servlet.Servlet介面尤為重要。所有的 servlet 必須實現這個介面或繼承已實現這個介面的類。Servlet 介面有五個方法,如下:public void init(ServletConfig config) throws ServletException public void service(ServletRequest request, ServletResponse response) throws ServletException,
㈣ java工作原理
作為一名Java使用者,掌握JVM的體系結構也是必須的。
說起Java,人們首先想到的是Java編程語言,然而事實上,Java是一種技術,它由四方面組成:Java編程語言、Java類文件格式、Java虛擬機和Java應用程序介面(Java API)。它們的關系如下圖所示:
運行期環境代表著Java平台,開發人員編寫Java代碼(.java文件),然後將之編譯成位元組碼(.class文件),再然後位元組碼被裝入內存,一旦位元組碼進入虛擬機,它就會被解釋器解釋執行,或者是被即時代碼發生器有選擇的轉換成機器碼執行。
Java平台由Java虛擬機和Java應用程序介面搭建,Java語言則是進入這個平台的通道,用Java語言編寫並編譯的程序可以運行在這個平台上。
在Java平台的結構中, 可以看出,Java虛擬機(JVM) 處在核心的位置,是程序與底層操作系統和硬體無關的關鍵。它的下方是移植介面,移植介面由兩部分組成:適配器和Java操作系統, 其中依賴於平台的部分稱為適配器;JVM 通過移植介面在具體的平台和操作系統上實現;在JVM 的上方是Java的基本類庫和擴展類庫以及它們的API, 利用Java API編寫的應用程序(application) 和小程序(Java applet) 可以在任何Java平台上運行而無需考慮底層平台, 就是因為有Java虛擬機(JVM)實現了程序與操作系統的分離,從而實現了Java 的平台無關性。
JVM在它的生存周期中有一個明確的任務,那就是運行Java程序,因此當Java程序啟動的時候,就產生JVM的一個實例;當程序運行結束的時候,該實例也跟著消失了。下面我們從JVM的體系結構和它的運行過程這兩個方面來對它進行比較深入的研究。
1、Java虛擬機的體系結構
·每個JVM都有兩種機制:
①類裝載子系統:裝載具有適合名稱的類或介面
②執行引擎:負責執行包含在已裝載的類或介面中的指令
·每個JVM都包含:
方法區、Java堆、Java棧、本地方法棧、指令計數器及其他隱含寄存器
對於JVM的學習,在我看來這么幾個部分最重要:
Java代碼編譯和執行的整個過程
JVM內存管理及垃圾回收機制
下面分別對這幾部分進行說明:
2、Java代碼編譯和執行的整個過程
也正如前面所說,Java代碼的編譯和執行的整個過程大概是:開發人員編寫Java代碼(.java文件),然後將之編譯成位元組碼(.class文件),再然後位元組碼被裝入內存,一旦位元組碼進入虛擬機,它就會被解釋器解釋執行,或者是被即時代碼發生器有選擇的轉換成機器碼執行。
(1)Java代碼編譯是由Java源碼編譯器來完成,也就是Java代碼到JVM位元組碼(.class文件)的過程。
(2)Java位元組碼的執行是由JVM執行引擎來完成。
Java代碼編譯和執行的整個過程包含了以下三個重要的機制:
·Java源碼編譯機制
·類載入機制
·類執行機制
(1)Java源碼編譯機制
Java 源碼編譯由以下三個過程組成:
①分析和輸入到符號表
②註解處理
③語義分析和生成class文件
最後生成的class文件由以下部分組成:
①結構信息:包括class文件格式版本號及各部分的數量與大小的信息
②元數據:對應於Java源碼中聲明與常量的信息。包含類/繼承的超類/實現的介面的聲明信息、域與方法聲明信息和常量池
③方法信息:對應Java源碼中語句和表達式對應的信息。包含位元組碼、異常處理器表、求值棧與局部變數區大小、求值棧的類型記錄、調試符號信息
(2)類載入機制
JVM的類載入是通過ClassLoader及其子類來完成的,類的層次關系和載入順序可以由下圖來描述:
①Bootstrap ClassLoader
負責載入$JAVA_HOME中jre/lib/rt.jar里所有的class,由C++實現,不是ClassLoader子類
②Extension ClassLoader
負責載入java平台中擴展功能的一些jar包,包括$JAVA_HOME中jre/lib/*.jar或-Djava.ext.dirs指定目錄下的jar包
③App ClassLoader
負責記載classpath中指定的jar包及目錄中class
④Custom ClassLoader
屬於應用程序根據自身需要自定義的ClassLoader,如tomcat、jboss都會根據j2ee規范自行實現ClassLoader
載入過程中會先檢查類是否被已載入,檢查順序是自底向上,從Custom ClassLoader到BootStrap ClassLoader逐層檢查,只要某個classloader已載入就視為已載入此類,保證此類只所有ClassLoader載入一次。而載入的順序是自頂向下,也就是由上層來逐層嘗試載入此類。
(3)類執行機制
JVM是基於堆棧的虛擬機。JVM為每個新創建的線程都分配一個堆棧.也就是說,對於一個Java程序來說,它的運行就是通過對堆棧的操作來完成的。堆棧以幀為單位保存線程的狀態。JVM對堆棧只進行兩種操作:以幀為單位的壓棧和出棧操作。
JVM執行class位元組碼,線程創建後,都會產生程序計數器(PC)和棧(Stack),程序計數器存放下一條要執行的指令在方法內的偏移量,棧中存放一個個棧幀,每個棧幀對應著每個方法的每次調用,而棧幀又是有局部變數區和操作數棧兩部分組成,局部變數區用於存放方法中的局部變數和參數,操作數棧中用於存放方法執行過程中產生的中間結果。棧的結構如下圖所示:
3、JVM內存管理及垃圾回收機制
JVM內存結構分為:方法區(method),棧內存(stack),堆內存(heap),本地方法棧(java中的jni調用),結構圖如下所示:
(1)堆內存(heap)
所有通過new創建的對象的內存都在堆中分配,其大小可以通過-Xmx和-Xms來控制。
操作系統有一個記錄空閑內存地址的鏈表,當系統收到程序的申請時,會遍歷該鏈表,尋找第一個空間大於所申請空間的堆結點,然後將該結點從空閑結點鏈表中刪除,並將該結點的空間分配給程序,另外,對於大多數系統,會在這塊內存空間中的首地址處記錄本次分配的大小,這樣代碼中的delete語句才能正確的釋放本內存空間。但由於找到的堆結點的大小不一定正好等於申請的大小,系統會自動的將多餘的那部分重新放入空閑鏈表中。這時由new分配的內存,一般速度比較慢,而且容易產生內存碎片,不過用起來最方便。另外,在WINDOWS下,最好的方式是用VirtualAlloc分配內存,它不是在堆,也不是在棧,而是直接在進程的地址空間中保留一塊內存,雖然這種方法用起來最不方便,但是速度快,也是最靈活的。堆內存是向高地址擴展的數據結構,是不連續的內存區域。由於系統是用鏈表來存儲的空閑內存地址的,自然是不連續的,而鏈表的遍歷方向是由低地址向高地址。堆的大小受限於計算機系統中有效的虛擬內存。由此可見,堆獲得的空間比較靈活,也比較大。
(2)棧內存(stack)
在Windows下, 棧是向低地址擴展的數據結構,是一塊連續的內存區域。這句話的意思是棧頂的地址和棧的最大容量是系統預先規定好的,在WINDOWS下,棧的大小是固定的(是一個編譯時就確定的常數),如果申請的空間超過棧的剩餘空間時,將提示overflow。因此,能從棧獲得的空間較小。只要棧的剩餘空間大於所申請空間,系統將為程序提供內存,否則將報異常提示棧溢出。 由系統自動分配,速度較快。但程序員是無法控制的。
堆內存與棧內存需要說明:
基礎數據類型直接在棧空間分配,方法的形式參數,直接在棧空間分配,當方法調用完成後從棧空間回收。引用數據類型,需要用new來創建,既在棧空間分配一個地址空間,又在堆空間分配對象的類變數 。方法的引用參數,在棧空間分配一個地址空間,並指向堆空間的對象區,當方法調用完成後從棧空間回收。局部變數new出來時,在棧空間和堆空間中分配空間,當局部變數生命周期結束後,棧空間立刻被回收,堆空間區域等待GC回收。方法調用時傳入的literal參數,先在棧空間分配,在方法調用完成後從棧空間收回。字元串常量、static在DATA區域分配,this在堆空間分配。數組既在棧空間分配數組名稱,又在堆空間分配數組實際的大小。
如:
(3)本地方法棧(java中的jni調用)
用於支持native方法的執行,存儲了每個native方法調用的狀態。對於本地方法介面,實現JVM並不要求一定要有它的支持,甚至可以完全沒有。Sun公司實現Java本地介面(JNI)是出於可移植性的考慮,當然我們也可以設計出其它的本地介面來代替Sun公司的JNI。但是這些設計與實現是比較復雜的事情,需要確保垃圾回收器不會將那些正在被本地方法調用的對象釋放掉。
(4)方法區(method)
它保存方法代碼(編譯後的java代碼)和符號表。存放了要載入的類信息、靜態變數、final類型的常量、屬性和方法信息。JVM用持久代(Permanet Generation)來存放方法區,可通過-XX:PermSize和-XX:MaxPermSize來指定最小值和最大值。
垃圾回收機制
堆里聚集了所有由應用程序創建的對象,JVM也有對應的指令比如 new, newarray, anewarray和multianewarray,然並沒有向 C++ 的 delete,free 等釋放空間的指令,Java的所有釋放都由 GC 來做,GC除了做回收內存之外,另外一個重要的工作就是內存的壓縮,這個在其他的語言中也有類似的實現,相比 C++ 不僅好用,而且增加了安全性,當然她也有弊端,比如性能這個大問題。
(4)java原理圖擴展閱讀
Java虛擬機的運行過程示例
上面對虛擬機的各個部分進行了比較詳細的說明,下面通過一個具體的例子來分析它的運行過程。
虛擬機通過調用某個指定類的方法main啟動,傳遞給main一個字元串數組參數,使指定的類被裝載,同時鏈接該類所使用的其它的類型,並且初始化它們。例如對於程序:
編譯後在命令行模式下鍵入: java HelloApp run virtual machine
將通過調用HelloApp的方法main來啟動java虛擬機,傳遞給main一個包含三個字元串"run"、"virtual"、"machine"的數組。現在我們略述虛擬機在執行HelloApp時可能採取的步驟。
開始試圖執行類HelloApp的main方法,發現該類並沒有被裝載,也就是說虛擬機當前不包含該類的二進制代表,於是虛擬機使用ClassLoader試圖尋找這樣的二進制代表。如果這個進程失敗,則拋出一個異常。類被裝載後同時在main方法被調用之前,必須對類HelloApp與其它類型進行鏈接然後初始化。鏈接包含三個階段:檢驗,准備和解析。檢驗檢查被裝載的主類的符號和語義,准備則創建類或介面的靜態域以及把這些域初始化為標準的默認值,解析負責檢查主類對其它類或介面的符號引用,在這一步它是可選的。類的初始化是對類中聲明的靜態初始化函數和靜態域的初始化構造方法的執行。一個類在初始化之前它的父類必須被初始化。
㈤ java虛擬機工作原理
從宏觀上介紹一下Java虛擬機的工作原理。從最初編寫的Java源文件(.java文件)是如何一步步執行的,如下圖所示,首先Java源文件經過前端編譯器(javac或ECJ)將.java文件編譯為Java位元組碼文件,然後JRE載入Java位元組碼文件,載入系統分配給JVM的內存區,然後執行引擎解釋或編譯類文件,再由即時編譯器將位元組碼轉化為機器碼。主要介紹下圖中的類載入器和運行時數據區兩個部分。
㈥ Java中的HashMap的工作原理是什麼
一,存儲方式: Java中的HashMap是以鍵值對(key-value)的形式存儲元素的。
二,調用原理: HashMap需要一專個hash函數,它使用屬hashCode()和equals()方法來向集合/從集合添加和檢索元素。當調用put()方法的時候,HashMap會計算key的hash值,然後把鍵值對存儲在集合中合適的索引上。如果key已經存在了,value會被更新成新值。
三,其他熱性: HashMap的一些重要的特性是它的容量(capacity),負載因子(load factor)和擴容極限(threshold resizing)。
㈦ java程序運行原理
先編譯,利用java編譯器(JDK自帶的工具)把java文件轉換成位元組碼文件(.class文件)
這個時候生成的位元組碼也不是計算機能識別的,還要讓jvm也就是java虛擬機解讀,java虛擬機首先讀入位元組碼、對位元組碼進行正確性檢查,針對客戶計算機平台生成對應的機器指令,由客戶機器執行機器指令。
希望對你有幫助
㈧ java 急求SpringMVC的工作原理的解釋和它的流程圖
Spring工作流程描述
1. 用戶向伺服器發送請求,請求被Spring 前端控制Servelt DispatcherServlet捕獲;
2.DispatcherServlet對請求URL進行解析,得到請求資源標識符(URI)。然後根據該URI,調用HandlerMapping獲得該Handler配置的所有相關的對象(包括Handler對象以及Handler對象對應的攔截器),最後以HandlerExecutionChain對象的形式返回;
3.DispatcherServlet 根據獲得的Handler,選擇一個合適的HandlerAdapter。(附註:如果成功獲得HandlerAdapter後,此時將開始執行攔截器的preHandler(...)方法)
4. 提取Request中的模型數據,填充Handler入參,開始執行Handler(Controller)。 在填充Handler的入參過程中,根據你的配置,Spring將幫你做一些額外的工作:
HttpMessageConveter: 將請求消息(如Json、xml等數據)轉換成一個對象,將對象轉換為指定的響應信息
數據轉換:對請求消息進行數據轉換。如String轉換成Integer、Double等
數據根式化:對請求消息進行數據格式化。 如將字元串轉換成格式化數字或格式化日期等
數據驗證: 驗證數據的有效性(長度、格式等),驗證結果存儲到BindingResult或Error中
5. Handler執行完成後,向DispatcherServlet返回一個ModelAndView對象;
6. 根據返回的ModelAndView,選擇一個適合的ViewResolver(必須是已經注冊到Spring容器中的ViewResolver)返回給DispatcherServlet;
7.ViewResolver 結合Model和View,來渲染視圖
8. 將渲染結果返回給客戶端。
Spring工作流程描述
為什麼Spring只使用一個Servlet(DispatcherServlet)來處理所有請求?
詳細見J2EE設計模式-前端控制模式
Spring為什麼要結合使用HandlerMapping以及HandlerAdapter來處理Handler?
符合面向對象中的單一職責原則,代碼架構清晰,便於維護,最重要的是代碼可復用性高。如HandlerAdapter可能會被用於處理多種Handler。
㈨ JAVA三框架工作原理是什麼
一、struts的工作原理:
1、初始化,讀取struts-config.xml、web.xml等配置文件(所有配置文件的初始化)
2、發送HTTP請求,客戶端發送以.do結尾的請求
3、填充FormBean(實例化、復位、填充數據、校驗、保存)
4、將請求轉發到Action(調用Action的execute()方法)
5、處理業務(可以調用後台類,返回ActionForward對象)
6、返回目標響應對象(從Action返回到ActionServlet)
7、轉換Http請求到目標響應對象(查找響應,根據返回的Forward keyword)
8、Http響應,返回到Jsp頁面
Hibernate工作原理:
1. 讀取並解析配置文件
2. 讀取並解析映射信息,創建SessionFactory
3. 打開Sesssion
4. 創建事務Transation
5. 持久化操作
6. 提交事務
7. 關閉Session
8. 關閉SesstionFactory
spring工作原理:
1.spring mvc請所有的請求都提交給DispatcherServlet,它會委託應用系統的其他模塊負責負責對請求進行真正的處理工作。
2.DispatcherServlet查詢一個或多個HandlerMapping,找到處理請求的Controller.
3.DispatcherServlet請請求提交到目標Controller
4.Controller進行業務邏輯處理後,會返回一個ModelAndView
5.Dispathcher查詢一個或多個ViewResolver視圖解析器,找到ModelAndView對象指定的視圖對象
6.視圖對象負責渲染返回給客戶端。
㈩ java開發功能設計原理和流程圖怎麼寫
你覺得這種題目還需要畫流程圖嗎?用pre、cur、count三個int類型變數就可以的題目就別浪費時間在流程圖身上了,繼續去做題目吧少年
作者:互聯網老黑
鏈接:https://www.hu.com/question/21325644/answer/66821957
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請註明出處。
我在公司任職產品經理多年,業余時間也獨立開發過一個APP,ios和android兩個版本都有,所以也算是完整經歷了整個產品開發到投入使用的生命周期,下面來講講具體的實現步驟:
(1)首先需要制定完整的產品需求,同時問自己幾個問題?
1. 產品的目標群體是誰?
2. 做的產品和市面上的眾多競品有哪些差異化?
3. 自己產品的核心優勢是什麼?怎樣通過可持續性迭代,來不斷保證自己的優勢?
(2)根據業務需求,設計具體的產品功能需求,例如需要哪些功能模塊:登錄、注冊、聊天、分享、評論、支付等等,最好能直觀點,畫出流程圖;
(3)根據需求,用axure畫出每個頁面以及所有業務邏輯的交互圖;
(4)交互圖出來後,再做設計圖以及產品的ICON圖標等,這里要注意手機解析度的問題,如果要適配多款解析度的手機,就要做多個尺寸的設計圖,當然如果要求不高,也可以做個通用版的尺寸,例如720*1280(高度一般不限);
(5)有了交互圖和設計圖後,就要考慮設計客戶端和服務端的介面協議,同時要架設web服務,寫服務端的介面,比如可以用java/php/nodejs等,一般小成本公司或個人,建議直接去阿里雲租用伺服器,比較穩定,擴展性也不錯;
(6)伺服器環境架設好,並且服務端介面也都寫好了,然後就寫客戶端代碼,ios和android,如果預算有限,只能先做一個客戶端,我建議是ios,因為android的源代碼,競爭對手可以通過反編譯來獲取(PS:由於有知友在這里提出疑問,我就補充一下,反編譯拿到後的盡管是經過混淆處理的代碼,但也是能看到大體的實現邏輯的,另外資源文件也都是可以完整地抓取),所以最好先做一個ios版本的APP,去市場試試水,效果好再做android版本,這樣你在市場上已經有了一定的用戶量和競爭壁壘,競爭對手就算要抄襲也不這么容易了;
(7)APP嵌入友盟統計的代碼,方便於你根據數據的反饋,隨時調整自己產品的戰略;
(8)android/ios客戶端版本開發完後,就是測試,沒有專業的測試人員,就去網上找一些專業測試雲平台,例如聽雲等,看看APP是否會有閃退等其它問題;
(9)測試通過後,正式發布上線,ios只需要發布到蘋果商店,通過即可;而android的發布市場多達幾十個,會相對麻煩一些;
(10)發布上線後,接下來要做的工作就是APP 的推廣以及產品的運營、後續迭代等,其實這一環節還能講許多,這里我先略過了,要講的話,我會針對專門的問題再回答一下。
老司機帶你分析SpringMVC框架設計原理與實現
鏈接:https://pan..com/s/1cksL0_VmSMdkIXWFSOx19g 密碼:57w4
Netty粘包分包現象及解決方案實戰,防socket攻擊
鏈接:https://pan..com/s/1kTF2oqHOqvrPJrKa7TpXOQ 密碼:dk9n
大型企業級高並發下資料庫水平切分之讀寫分離技巧詳解
鏈接:https://pan..com/s/1OrXSGCCboqgVX2vgfC7Z7Q 密碼:ri8q
分布式事務出現場景及解決方案詳細剖析
鏈接:https://pan..com/s/1BBf6cePibN0xawFEY7A6ZA 密碼:380p
以上都是小編收集了大神的靈葯,喜歡的拿走吧!喜歡小編就輕輕關注一下吧!