導航:首頁 > 編程語言 > java訂單原理

java訂單原理

發布時間:2022-05-24 01:40:43

1. 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++ 不僅好用,而且增加了安全性,當然她也有弊端,比如性能這個大問題。

(1)java訂單原理擴展閱讀

Java虛擬機的運行過程示例

上面對虛擬機的各個部分進行了比較詳細的說明,下面通過一個具體的例子來分析它的運行過程。

虛擬機通過調用某個指定類的方法main啟動,傳遞給main一個字元串數組參數,使指定的類被裝載,同時鏈接該類所使用的其它的類型,並且初始化它們。例如對於程序:

編譯後在命令行模式下鍵入: java HelloApp run virtual machine

將通過調用HelloApp的方法main來啟動java虛擬機,傳遞給main一個包含三個字元串"run"、"virtual"、"machine"的數組。現在我們略述虛擬機在執行HelloApp時可能採取的步驟。

開始試圖執行類HelloApp的main方法,發現該類並沒有被裝載,也就是說虛擬機當前不包含該類的二進制代表,於是虛擬機使用ClassLoader試圖尋找這樣的二進制代表。如果這個進程失敗,則拋出一個異常。類被裝載後同時在main方法被調用之前,必須對類HelloApp與其它類型進行鏈接然後初始化。鏈接包含三個階段:檢驗,准備和解析。檢驗檢查被裝載的主類的符號和語義,准備則創建類或介面的靜態域以及把這些域初始化為標準的默認值,解析負責檢查主類對其它類或介面的符號引用,在這一步它是可選的。類的初始化是對類中聲明的靜態初始化函數和靜態域的初始化構造方法的執行。一個類在初始化之前它的父類必須被初始化。

2. 在線購物系統中訂單提交應用了哪些技術,java,越詳細越好

訂單的提交涉及到許多。首先一個訂單關聯著用戶表、產品表和訂單表三個表單。當用戶提交訂單的時候需要首先判斷產品表中的庫存數量,如果夠了,就從庫存數量鎮南關減去訂單中的需求量,然後向訂單表中插入訂單數據。這僅僅是後台有關資料庫的內容。前端界面顯示層可能涉及到Ajax技術。在業務層方面你的訂單數據使用表單的Post方式提交給Servlet的,Servlet調用業務層的業務Bean來進行各種邏輯處理,讓後再由Servlet將處理結果轉交給一個視圖頁面(jsp)。

3. 你知道java的運行原理是什麼嗎

Java這一語言的執行過程也遵循這樣的過程:源代碼--->機器碼。 但是,從源代碼到機器碼之間,究竟經過什麼樣的過程,則是Java獨一無二的了。寬泛地講,Java源代碼(.java)經過java編譯器(javac.exe)編譯之後,並沒有直接轉化為機器碼,而是轉化成一種中間格式,成為位元組碼(.class),位元組碼再經過java虛擬機轉化成特定CPU架構的機器碼。也正是因為這一中間物,java才有所謂的跨平台。在windows平台上編譯好的位元組碼,到linux平台後,經過為linux而設計的Java虛擬機解釋後即可執行。跨平台這一特徵,是通過位元組碼和JVM來實現的。
因此,想搞清楚java程序到底是如何運行的,重點在於弄明白位元組碼是如何被轉化成跟CPU架構相關的機器碼然後被執行的。也就是要理解JVM到底是如何工作的。在了解JVM之前,我們再跳出來一下,先看看什麼是虛擬機。所謂虛擬機,我是這么理解的:用軟體的方式模擬出跟硬體類似的環境,比如說寄存器、存儲器等等。當然,所有最終的工作還是由原來的CPU來完成。比如說VirtualBox這個虛擬機產品,它其實就是一個應用程序,用某種編程語言編寫的應用程序。當運行這個應用程序時,它會要求操作系統給它獨立施展手腳的空間:給我一些內存,給我一定的CPU時間片,然後不用管我了。你可能會問,寄存器是硬體啊,它怎麼能劃分啊,難道是時間劃分?不是的,像內存這樣的硬體,可以給虛擬機一塊獨立的內存塊,但是寄存器之後的,則需要用「模擬模擬」的方式來模擬。OK,回到Java虛擬機。到底什麼是Java虛擬機,很難有一個十分明確的定義,狹窄一點說,它就是一個應用程序,大部分用C++編寫的。寬泛地說,它就是執行位元組碼的一整個環境。

4. java實現實時訂單推送需要用到什麼技術

1:支付技術,訂抄單需要支付
2:流程,訂單系統肯定從下單到支付再到送貨等一系列需要走流程
3:定位技術,訂單需要地理定位,幫助送貨員准確送貨到買家
4:消息技術,在訂單走到任何環節都需要消息及時反饋
5:搜索技術,買家會在系統搜索滿意的物品

5. java編程原理(簡單的說一下)

Java的編程原理復 編譯原理: 先寫制Java的源代碼。 然後交給虛擬機 虛擬機將其編譯為 位元組碼 然後再進行運行。 Java的編譯後的位元組碼,不是成為機器碼。它必須要求有編譯器在旁解釋。 它是解釋型編譯編程原理: Java 主要面向OOP, Java 面向對象編程語言,基本上寫每個程序 都在面向整個世界的對象 而描寫,Java比你學過的C++ 更為靈活。比如介面、 或者你需要更多的答案。 請提問

6. java運行原理

Java實在」虛擬機「上進行的編譯和運行。
解釋:在Java中引入了虛擬機的概念,即在機器和編譯程序之間加入了一層抽象的虛擬的機器。這台虛擬的機器在任何平台上都提供給編譯程序一個的共同的介面。編譯程序只需要面向虛擬機,生成虛擬機能夠理解的代碼,然後由解釋器來將虛擬機代碼轉換為特定系統的機器碼執行。在Java中,這種供虛擬機理解的代碼叫做位元組碼(ByteCode)(class文件的內容),它不面向任何特定的處理器,只面向虛擬機。每一種平台的解釋器是不同的,但是實現的虛擬機是相同的。Java源程序經過編譯器編譯後變成位元組碼,位元組碼由虛擬機解釋執行,虛擬機將每一條要執行的位元組碼送給解釋器,解釋器將其翻譯成特定機器上的機器碼,然後在特定的機器上運行。

7. java伺服器處理訂單回調採用何種方法好

回調的話,伺服器是不用能用線程處理的,原因是伺服器根本不知道客戶端有沒有關閉瀏覽器等等,但是可以通過http長連接來實現,或者用ajax輪詢的方式實現
不過現在有現成的框架dwr,樓主可以去看看,用法挺簡單的,原理是用javascript與java互相調用

8. JAVA介面的原理

介面的實現原理 應該說介面實現是沒有什麼原理的
你定義了一個介面 不去用他也是可以的 沒有問題的
介面可以說是一個工具 或者說是一個規范
在寫作文的時候 老師規定要列提綱 但是實際上作文是可以脫離
提綱而獨立存在 但是有了提綱我們就能很快了解到作為的內容
介面一樣的 一開始我們編程 可能都用不到介面 所以一直在迷惑
這介面到底有什麼作用。
介面當然很有用
等到你做一個大的項目的時候 你就會發現 有一些實體 服務 他們都是差不多的
那就有必要事先把這些服務抽象出介面來
然後我們的編碼就按照介面的規范來實現具體的功能。
以後要是資料庫表結構發生了大變化 重構代碼難度很大 需要這部分功能重新開放 那麼這個介面 就可以復用 對這個介面 進行實現就可以了。

總結出來:介面是服務於我們的代碼 讓我們的代碼更好理解 更有層次感
具體的系統功能 還是在我們的實現類底下的 service最終還是調用我們實現類的

以上原創 手打 沒有用標點的習慣

9. java web 怎麼實現新訂單 及時推送給商家

般來說推復送都會嘗試去維持制一個類似消息中心的角色 訂單服務通過某種機制通知消息中心 由消息中心統一調度生成消息 這個階段有很多辦法 消息隊列是其中之一 如果系統比較小甚至消息中心和訂單都是一個系統 直接調用或者使用以下觀察者模式就可以搞定 第二個階段是常規的開發都是由前台發起請求後台響應 現在要反轉過來 後台維持連接 最簡單的就是ajax輪詢 如果這個功能不是核心的話可以試試WebSocket 而如果後台是SpringMVC的話可以自然集成SockJS進來 而對於大部分系統來說比較理想的設計就是消息中間件解耦訂單和消息中心 消息中心通過WebSocket來推送消息 此時消息中心是一個單獨的服務

10. java web 怎麼實現新訂單提醒

一般來說推送都會嘗試去維持一個類似消息中心的角色 訂單服務通過某種機制通知消息中心 由消息中心統一調度生成消息 這個階段有很多辦法 消息隊列是其中之一 如果系統比較小甚至消息中心和訂單都是一個系統 直接調用或者使用以下觀察者模式就可以搞定 第二個階段是常規的開發都是由前台發起請求後台響應 現在要反轉過來 後台維持連接 最簡單的就是ajax輪詢 如果這個功能不是核心的話可以試試WebSocket 而如果後台是SpringMVC的話可以自然集成SockJS進來 而對於大部分系統來說比較理想的設計就是消息中間件解耦訂單和消息中心 消息中心通過WebSocket來推送消息 此時消息中心是一個單獨的服務 就算炸了也不會影響主系統

閱讀全文

與java訂單原理相關的資料

熱點內容
shs文件怎麼刪除 瀏覽:913
什麼優app黃色 瀏覽:292
大人變小孩的電影 瀏覽:852
想做老師有什麼app好用 瀏覽:485
七星彩網購app有哪些 瀏覽:713
js12和K9 瀏覽:69
手機越獄看片 瀏覽:359
小米2s能刷安卓60 瀏覽:673
李彩潭性感勾魂 瀏覽:965
全民網課app哪個最好 瀏覽:560
韓劇電影在線免費 瀏覽:263
電影新空房禁地在線 瀏覽:14
蘋果平板電腦mimi432g 瀏覽:211
ios百度網盤本地文件怎麼打開 瀏覽:491
日常型常量數據用什麼符號引起 瀏覽:198
黑人英語課作弊播放 瀏覽:602
有劇情的露點電影 瀏覽:799
家旺家俊阿梅是哪個電影 瀏覽:318
皮皮陪練app怎麼發布動態 瀏覽:565
什麼app可以批量添加自定義水印 瀏覽:885

友情鏈接