營運角度的Java知識點總結

來源:互聯網
上載者:User

標籤:營運角度的java知識點總結


JAVA是一個物件導向的程式設計語言,由SUN公司的程式員所開發、它不僅吸收了C++的各種優點,而且還撇棄了C++中難以理解的概念,如多繼承、指標等;因此JAVA語言具有功能強大且簡單易用兩個特徵,JAVA作為靜態物件導向語言的代表,是全世界最受歡迎的電腦語言(沒有之一)


Java包含四個獨立卻又彼此相關的技術

  1. JVM,Java的虛擬機器,在JVM上運行Java的bytecode(位元組碼)

  2. Java的程式程式設計語言

  3. Java Class,Java的類檔案格式;其決定Java程式編譯出的位元組碼應該遵循那些規範等

  4. JAVA的應用程式介面(Java API);為了能讓Java的應用程式得到更快更高效的開發,Java官方提供了Java API




Java展示的檔案通常都是Java類的檔案格式,而Java的來源程式要轉換成位元組碼才能在JVM上運行


一般Java的程式碼從寫到運行要經過以下幾個步驟:

  1. Java程式語言+Java API 由程式員開發出來源程式如X.java

  2. X.java來源程式經過編譯器編譯為Java的類檔案如X.class(Java的類檔案就是Java的位元組碼)

  3. 在JVM中,class loader(類載入器)載入X.class類檔案,然後由解譯器將X.calss檔案由位元組碼格式解釋成對應的OS平台二進位程式,這樣Java程式就可以再JVM上運行了



註:.class檔案就是位元組碼,但位元組碼不能直接運行,仍需在JVM中由解譯器解釋成對應的OS二進位程式,才能運行(機器只能理解二進位)


為Java代碼從寫到執行的過程


650) this.width=650;" src="http://img1.51cto.com/attachment/201309/18/2033581_1379484229ak7w.png" alt="效果1" />


JVM進行解釋的實現方式:

  1. 一次性解譯器,解釋位元組碼並執行,但第二次執行需要重新解釋位元組碼

  2. 即時編譯器,解釋完的類(位元組碼)會緩衝再記憶體中,讓下次執行時直接使用,不用再次執行,但這樣對所有解釋產生的二進位程式都緩衝會非常佔用記憶體

  3. 自適應解譯器,只將執行頻率高的代碼進行解釋然後將解釋後的二進位程式進行緩衝,下次執行無需解釋,一般只緩衝20%的代碼解釋(認為這20%的程式碼完成了80%的操作)

  


下面是JAVA的執行過程

650) this.width=650;" src="http://img1.51cto.com/attachment/201309/18/2033581_1379484230GET7.png" alt="2033581_1379484230GET7.png" />





JVM(Java Virtual Machine)即Java虛擬機器,是一種用於計算裝置的規範,也是Java的核心和基礎,是Java解譯器和OS平台之間的虛擬處理器,它是一種基於下層的作業系統和硬體平台利用軟體方法抽象出的電腦。可以在 上面執行Java的位元組碼程式,正是因為JVM的存在Java才實現了一次編譯到處運行,可實現完全跨平台的運行


Java的編譯器只需面向JVM,產生JVM能理解的位元組碼檔案,然後由JVM將每一條指令翻譯成為不同平台的機器代碼(二進位程式),然後既可以在對應的平台執行


       650) this.width=650;" src="http://img1.51cto.com/attachment/201309/18/2033581_1379484229OcvU.png" alt="2033581_1379484229OcvU.png" />


Java平台由Java虛擬機器(Java Virtual Machine,簡稱JVM)和Java 應用編程介面(Application Programming Interface,簡稱API)構成。Java應用編程介面為此提供了一個獨立於作業系統的標準介面,可分為基本部分和擴充部分。在硬體或作業系統平台上安裝一個Java平台之後,Java應用程式就可運行。Java平台已經嵌入了幾乎所有的作業系統。這樣Java程式可以只編譯一次,就可以在各種系統中運行。Java應用編程介面已經從1.1x版發展到1.2版。常用的Java平台基於Java1.5,最近版本為Java7.0。



JRE (Java running Environment)Java的運行環境:JRE可以讓編譯好的類(位元組碼)運行起來,是讓Java運行起來的最小環境。簡單來說JRE=JVM+API(不包括與開發有關的API)


JDK (Java Development Kit)是Java語言的軟體開發套件,是實現Java語言開發並讓其啟動並執行最小環境。簡單來說JDK=Java語言+API+編譯器+JVM


依據Java應用領域的不同,JDK有以下幾種分類:


Java SE(J2SE),standard edition,標準版,是我們通常用的一個版本,從JDK 5.0開始,改名為Java SE。


Java EE(J2EE),enterprise edition,企業版,使用這種JDK開發J2EE應用程式,從JDK 5.0開始,改名為Java EE。


Java ME(J2ME),micro edition,主要用於行動裝置、嵌入式裝置上的java應用程式,從JDK 5.0開始,改名為Java ME。


沒有JDK的話,無法編譯Java程式,如果想只運行Java程式,要確保已安裝相應的JRE。



下面來講Java兩個特殊的類Applet和Servlet


Applet是採用Java程式設計語言編寫的,經過編譯後Applet小程式可以嵌入到HTML中去(含有Applet的網頁的HTML檔案代碼中部帶有<applet> 和</applet>這樣一對標記),然後client端的瀏覽器中只要安裝JRE外掛程式就可以在client端運行這個Apple應用小程式,並將結果顯示在client上,這便是用戶端動態網站


但是用戶端動態網站有一很危險的地方,那就是如果有人給你往HTML網頁中嵌入的是一個有害的applet程式,你在client一執行會對你的電腦造成破壞,而且applet的執行必須在client端安裝有JRE,所以applet現在已經很少見了



HTML檔案中關於Applet的資訊至少應包含以下三點:

1)位元組碼檔案名稱(編譯後的Java檔案,以.class為尾碼)

2)位元組碼檔案的地址

3)在網頁上顯示Applet的方式。


Servlet(Server Applplet)是用Java編寫的伺服器端程式,其主要功能為互動瀏覽和修改資料,產生動態Web資源;Servlet可以讓Java語言依據類似的CGI(common gateway interface)技術開發運行在伺服器端的動態web資源,但在通訊量大的伺服器上,Java Servlet 的優點在於它們的執行速度更快於 CGI 程式。各個使用者請求被啟用成單個程式中的一個線程,而無需建立單獨的進程,這意味著伺服器端處理請求的系統開銷將明顯降低。


Servlet 的主要功能在於互動式地瀏覽和修改資料,產生動態 Web 內容。這個過程為:

1.用戶端發送請求至伺服器端;

2.伺服器將請求資訊發送至 Servlet;

3.Servlet 產生響應內容並將其傳給伺服器。響應內容動態產生,通常取決於用戶端的請求;

4.伺服器將響應返回給用戶端。



JSP(Java Server Page)Java的伺服器頁面,它是Servlet的一個特殊的類,在根本上是一個簡化的Servlet設計,JSP是在傳統的網頁HTML檔案(*.html或*.htm)中插入Java的程式段,從而形成了JSP檔案(通常為*.jsp);用JSP開發的web應用是支援跨平台的,既能在Linux上運行,也能在其他的作業系統上運行,開發JSP程式的一個著名架構是SSH(Structs、Spring、Hebernate)


JSP實現了Html文法中的java擴充(以 <%, %>形式)。JSP與Servlet一樣,是在伺服器端執行的。通常返回給用戶端的就是一個HTML文本,因此用戶端只要有瀏覽器就能瀏覽(Applet要在client上裝JRE)。


註:

Applet只是將一個編譯後的Applet小程式嵌入到HTML中然後發送到client,在client端依據JRE運行;


Servlet主要是實現了用Java語言開發運行在server端的Web動態資源;而這些依據Java語言開發的web動態資源大多數都是.jsp資源


JSP是一種指令碼語言,主要實現了將JAVA代碼嵌入到HTML中(這也是JSP和Servlet的最主要區別),從而產生了.jsp類的web動態資源,從而實現了基於Java技術的動態網站開發


JSP的運行效能要比PHP好,所以一些大型網站都用JSP開發,.jsp程式執行流程如下


  1. .jsp由Jasper處理未.java來源程式

  2. .java由編譯器編譯為.class

  3. .class類在jvm上進行載入解釋並運行


JSP 的運程過程

一個JSP頁面有多個客戶訪問,下面是第一個客戶訪問JSP頁面時候,JSP頁面的執行流程:

客戶通過瀏覽器向伺服器端的JSP頁面發送請求

  • JSP引擎檢查JSP檔案對應的Servlet原始碼是否存在,若不存在轉向第4步,否則執行下一步

  • JSP引擎檢查JSP頁面是否需要修改,若沒修改,轉向第5步,否則執行下一步

  • JSP引擎將JSP分頁檔轉譯為Servlet原始碼(相應的 .java 代碼)

  • JSP引擎將Servlet原始碼編譯為相應位元組碼( .class代碼 )

  • JSP引擎載入位元組碼到記憶體

  • 位元組碼處理客戶請求,並將結果返回給客戶


650) this.width=650;" src="http://img1.51cto.com/attachment/201309/18/2033581_1379484230Pbtf.png" alt="2033581_1379484230Pbtf.png" />



在不修改JSP頁面的情況下,除了第一個客戶訪問JSP頁面需要經過以上幾個步驟外,以後訪問該JSP頁面的客戶請求,直接發送給JSP對應的位元組碼程式處理,並將處理結果返回給客戶,這種情況下,JSP頁面既不需要啟動伺服器,以便重新載入修改後的JSP頁面。


CGI(Common Gateway Interface)通用閘道介面,CGI是外部應用程式(CGI程式)和Web伺服器之間的介面標準(也可以理解為一種協議或機制),是在CGI程式和Web伺服器之間傳遞資訊的過程;CGI可以讓一個用戶端,從網頁瀏覽器向執行在網路伺服器上的程式傳輸資料CGI描述了用戶端和伺服器之間傳輸的一種標準

下面列子可以理解CGI的作用


用戶端請求伺服器,web伺服器響應一個HTML靜態表單,而使用者填寫完表單後又將此表單交給了web伺服器(相當於又一次http請求),web伺服器收到client端填寫的表單後會以CGI協議的方式提交給後端的應用程式讓其處理


很多應用程式都可以傳遞參數,CGI可以讓使用者通過表單提供一些資料,然後把這些資料當做參數傳遞給相應的後端應用程式(如PHP)讓程式對其加工處理(不過後端應用程式是PHP、C、C++甚至是一個指令碼CGI都可以與其互動)讓後端程式或指令碼來處理資料,處理完後,後端程式再次通過CGI機制返回給前段的web伺服器(httpd/Nginx)再由web伺服器將結果封裝響應給用戶端


在LAMP和LNMP架構中PHP與前段Apache/Nginx之間就是通過CGI機制結合的,用於將用戶端的動態請求(主要為php的動態資源請求)從前端web_server傳遞到後端的PHP,讓PHP處理。




Servlet Container(Servlet容器):包含JDK及JDK所不具備的功能,可以讓一個Servlet運行起來,有相應的Servlet進程,Servlet進程負責接收前端CGI傳遞來的請求,並在本地的JVM上運行處理,並且負責監控本地的.java程式是否發生了修改,一旦發生修改則重新讓編譯器(由JDK提供)編譯成.class類


Web Container (Web容器)是一個包含Jasper和Servlet相關的技術的架構,其中Jasper負責監控本地的.jsp程式是否發生修改,一旦修改就根據需求將其裝換為.java原始碼,而.java就交給Servlet處理


註:Web Container比Servlet Container多了一個Jasper


而現在很多的Web容器都可以直接和使用者的請求直接進行互動(即前端沒有web server解碼http請求和封裝http響應)web容器可以完全依靠自己的組件(對Tomcat來說為web container的連接器)實現直接與client進行互動。但是讓連接器直接面對使用者的請求,可能會造成壓力過大處理不過來的情況(如果連接器的效能不是很好),所以一般會在前端加一個web代理(如Nginx),讓Nginx建立、維持、釋放使用者的請求和串連,而當使用者的請求資源在前端web server(Nginx)上沒有緩衝時,再由Nginx將請求轉寄到後端web Container(如Tomcat)處理。而對應的這種架構叫:


Nginx + Java的Web Container(有時也成為應用程式伺服器)


但無論是Web Container還是Servlet Container或者是JDK都是在JVM中啟動並執行,Web Container|Servlet Container|JDK真正啟動後再OS中表現的都是一個JVM進程(JVM執行個體),即在JVM中如果你是一個Web Containter它就有Web Container的功能,是JDK就有JDK的功能,負責只有JVM自身的功能


JVM執行個體可以在同一個JVM執行個體中啟動多個線程,從而完成並發響應,JVM中還包括:


線程私人記憶體區

  1. 程式計數器

  2. Java虛擬機器棧(主要用來儲存本地變數)


線程共用記憶體區

  1. 方法區

  2. 堆(堆佔用的記憶體最大)主要用來儲存物件,當計數器為0時就認為對象已死,然後由GC(Garbage Collector)進行清除,避免堆溢出



而GC對對象的清理要依據一定的演算法,有以下幾種

  1. 標記清除演算法(哪個對象死了先進行標記,然後統一清除),但這種機制有個弊端就是在GC進行垃圾清除時會讓CPU飆升,造成伺服器效能忽然下降,且會產生大量的記憶體片段

  2. 複製演算法,每個對象存兩份,不會產生記憶體片段但是記憶體使用量率只有1/2




GC的種類

  1. serial 一次只能回收一個對象,串列

  2. parNew 一次可以回收讀個,並行回收

  3. CMS(Concurrent Mark Sweet)並行標記清除,多線程,儘可能降低清除對JVM中程式的停頓,但缺點是無法收集浮動垃圾(只要線程在運行,就不能收集)

  4. G 1 特點是不會產生記憶體片段、可以定義停頓的時間




祝大家新年快樂!!!2017 努力!奮鬥!!!


650) this.width=650;" src="https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&quality=100&size=b4000_4000&sec=1483198356&di=28a68ae39aecbecb90db34bb151cf8d8&src=http://img22.mtime.cn/up/2011/07/09/222256.34952163_500.jpg" alt="222256.34952163_500.jpg" />







本文出自 “11097124” 部落格,請務必保留此出處http://11107124.blog.51cto.com/11097124/1888133

營運角度的Java知識點總結

聯繫我們

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

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

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.