java
-
簡述
-
java基礎
-
jvm
-
java環境搭建
簡述
什么是java?
java是一門面向對象的編程語言,具有簡單性、面向對象、分布式、健壯性、安全性、平臺獨立與可移植性、多線程、動態性等特點,特別是可移植性,java所有的代碼都需要在一個特定的虛擬環境中實現,所以可移植性方面非常好,一次編譯,永久使用。
java可以做到什么?
Java可以編寫桌面應用程序、Web應用程序、分布式系統和嵌入式系統應用程序等。
java基礎
java組件結構
java根據組件的不同,大致可分為三類:
java2 se:java 2 Standard Edition(標準版),組件主要為JDK,支持桌面應用程序編程。 java2 ee:java 2 Enterprise Edition(企業版),組件為JDK加上web容器組成,可以視為是se的升級版,主要用于動態網頁程序開發。 java2 me:java 2 mobile Edition(移動版),組件為JDK加上mobile容器組成,可以視為是se的升級版,主要用于移動端的程序開發。
jdk
JDK是jiva的基礎開發工具包,是整個java開發的核心,不管是向上擴展的ee me都是以jdk為核心,jdk主要包含了jvm,java的工具,java的基礎類庫。
java2 ee
java2ee是java的web開發包的范式規定,定義了java2ee需要包含java2se的所有內容并且增添了serverlet,JDBC,EJB,JMX,JSP等一眾組件,并且基于這個范式,有眾多的商業版和開源版實現軟件。
serverlet (Server Applet):允許在java代碼中嵌入html代碼。 JDBC (Java Database Connectivity):提供連接各種關系型數據庫的統一API。 EJB (Enterprise JavaBeans):創建,部署,跨平臺管理的java組件。 JMX (Java Management Extensions):為應用程序,系統植入管理功能的工具。 JSP (Java Server Pages):是一種簡化的serverlet,通過在html中嵌入java程序段來實現動態網頁的開發,但實際上是通過JAVA2ee的轉換器實現的。 關于JSP與serverletL: JSP的代碼會被服務端給翻譯成serverlet的形式,之后才會去編譯成類放在JVM上運行。 java2 ee 的實現: 商業: 開源: Websphere Tomcat Weblogic Jetty oc4j Resin JBoss
編程的名詞解釋
對象(Object):在內存上一段有意義的區域,是類的一個實例。 類(Class):是具有共同特征的對象的集合。 方法(method):是對象能實現的一個操作,一個動作。
java代碼的運行流程
source code -> 編譯(compile) -> class -> class load -> jvm -> OK
在java中,所有的程序都是通過類調用的方式來運行,包括對庫調用也是使用的調用類庫來實現的,并且所有的程序都是運行在java虛擬機上,所以才能做到一次編譯,到處運行。
linux中的環境變量
JAVA_HOME : 需要在linux中自行設定此變量,很多JAVA應用程序都會去通過這個變量去尋找java的程序路徑。
jvm
jvm是jdk中不可缺少的一環,jvm提供了java程序的運行環境,才使得做到一次編譯,到處運行。
運行時區域:
JVM運行時,也會占據內存空間,我們稱這段空間為 jvm的運行時區域: 方法區:存放jvm中的靜態變量,常量,方法等。 java堆(heap):主要存放對象的區域,也是GC的主要工作區,更替速度快。 java棧(stack):存放了java中的局部變量和局部變量表等信息。 pc計數器:存放了代碼執行到的行數和指向下一行代碼的指針,"類似"于cpu的指令指針寄存器的效用。 本地方法棧(stack):存放了本地主機中的局部變量和變量表信息。
heap區域
jvm的運行時區域中,heap區是占據了最大的空間并且也是GC垃圾處理器的主要工作區域,因為heap中存放了所有的對象,并且對象的更替十分平凡。 heap區主要分為三代,年輕代,老年代和持久代,根據對象的存活時間來劃分: young:年輕代,共分為三部分。 eden:存放了新生的對象。 from:當產生了新的對象時,原來的新生對象如果存活就會被移動到這個區域中。 to:前兩個都有垃圾需要清理時,繼續存活的對象就會被移動到這個區域中。 tenured:老年代,當年輕代中來回移動的數據集合中,有一個數據存活時間達到指定程度就會將其移動到老年代中,并標識成為長期的一個對象,不會被輕易清理。 perm:永久代,之中的對象永遠不會被清理。 reserved:預留空間,每一個代中都會有這個區域,當heap初始時,并不會分配給每個區域所有的空間,而是會隨著使用量來慢慢增加至最大值。
young中之所以要存在三個區域,是因為要提供其中的對象的相互移動,to和from區域一定會有一個區域不處于GC狀態,所以,當其他兩個區域出現GC時,就會將還存活的對象移動到沒有GC的區域中(不會是eden區),并且會根據存活時間來判斷是否已經達到了老年代的移動資格,GC是非常重要的一環。
young中的對象活動非常頻繁,所以對比老年代,年輕代產生了大量的對象,但是很少會存活到老年代,所以年輕代會產生大量的垃圾需要清理。
GC
新生代回收: minor GC 回收過程: 1.當eden中產生垃圾后,先將存活的對象放入to區,并清理eden區。 2.存放了新生對象的eden區和to區產生新的垃圾,就會將所有存活對象放入from區,并清理其他兩個區。 3.當繼續存放了新生對象的eden區和from產生垃圾時,就會將所有存活對象重新放入to區,并清理其他區。 4.如此循環,直到其中有堅強的依然存活的對象存活時間達到標準后,才會將那個對象單獨拉出來放入老年代,其他行為繼續進行。 老年代回收: major GC (Full GC) 回收過程: 1.先遍歷老年代,將所有的垃圾mark一下。 2.之后再去將所有已經標記的對象打包歸檔一塊兒清除。
會產生的問題:
由于GC不會同步進行,而是在相同時間差才清理一次,所以如果垃圾非常多,一次清理的量也會非常大,這樣就會占用大量的進程資源,導致所有java進程都被GC給占用了,導致其他的java進程暫時停頓無法運行,就會有那么一段時間的stop.
特別是老年代的GC處理,要通過遍歷老年代并標記后才會去歸檔打包清理,更加消耗進程資源,所以當產生了major GC后,系統卡殼的情況就會非常明顯。
jvm參數
-XMX 所有的young和tenured的max空間總和。 -XMS young和tenured的初始空間總和。 -XX:NewSize 新生代的初始空間和。 -XX:MaxNewSize 新生代的MAX空間和。 -XX:Permsize 持久代的初始空間和。 -XX:MaxPermSize 持久代的max空間和。 ... 更多參數可以查閱文檔。
jvm的參數通過java命令行來傳遞,如
/usr/local/jdk/bin/java -Dresin.home=/usr/local/resin -server -Xms1800M -Xmx1800M -XX:PermSize=300M -XX:MaxPermSize=300M
jvm的性能監控
jps jstack [option] PID jmap jhat jstat GUI:jconsole jvisualvm
java環境搭建
# yum install jdk-release.rpm 可以通過直接下載安裝jdk包或者通過yum命令去yum倉庫中下載安裝,centos6和7的base源中提供了openjdk的版本。 # echo "export JAVA_HOME=/usr/java/latest" > /etc/profile.d/java.sh 設置JAVA環境變量 # . /etc/profile.d/java.sh 重讀文件。 如果需要其他版本的jdk,可以自行去net搜索安裝即可。
原創文章,作者:Net18_肖肖,如若轉載,請注明出處:http://www.www58058.com/19865