java基礎與環境

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的運行時區域:

方法區:存放jvm中的靜態變量,常量,方法等。
java堆(heap):主要存放對象的區域,也是GC的主要工作區,更替速度快。
java棧(stack):存放了java中的局部變量和局部變量表等信息。
pc計數器:存放了代碼執行到的行數和指向下一行代碼的指針,"類似"于cpu的指令指針寄存器的效用。
本地方法棧(stack):存放了本地主機中的局部變量和變量表信息。

heap區域

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

(0)
Net18_肖肖Net18_肖肖
上一篇 2016-06-23 11:13
下一篇 2016-06-24 12:48

相關推薦

  • shell的變量功能

                                                      &nbsp…

    2017-08-05
  • 馬哥教育網絡21期+第一周練習博客

    一、描述計算機的組成及其功能。   計算機設備是由運算器、控制器、存儲器、輸入設備和輸出設備組成。它們的功能和對應設備分別如下: 運算器(arithmetic unit):在計算機中執行各種算術和邏輯運算操作的部件。運算器包括寄存器、執行部件和控制電路3個部      &nbsp…

    Linux干貨 2016-07-12
  • Linux上的文件管理類命令都有哪些,其常用的使用方法及其相關示例演示

    目錄與路徑 相對路徑與絕對路徑 絕對路徑:路徑的寫法【一定由根目錄 / 寫起】 /usr/share/doc 這個目錄。 相對路徑:路徑的寫法【不是由 / 寫起】 由 /usr/share/doc 要到 /usr/share/man 底下時,可以寫成: 【cd ../man】這就是相對路徑的寫法。相對路徑意指相對于當前的工作目錄 cd (切換目錄) . &n…

    Linux干貨 2016-11-06
  • Xtrabackup進行MySQL備份

    使用Xtrabackup進行MySQL備份 一、安裝 1、簡介 Xtrabackup是由percona提供的mysql數據庫備份工具,據官方介紹,這也是世界上惟一一款開源的能夠對innodb和xtradb數據庫進行熱備的工具。 特點: (1)備份過程快速、可靠; (2)備份過程不會打斷正在執行的事務; (3)能夠基于壓縮等功能節約磁盤空間和流量; (4)自動…

    Linux干貨 2017-02-20
  • 誰說C語言很簡單?

    前兩天,Neo寫了一篇《語言的歧義》其使用C語言討論了一些語言的歧義。大家應該也順便了解了一下C語言中的很多不可思異的東西,可能也是你從未注意到的東西。 是的,C語言并不簡單,讓我們來看看下面這些示例: 為什么下面的代碼會返回0?(這題應該很簡單吧) int x;   return x == (1&…

    Linux干貨 2016-03-20
  • shell腳本

    最近學了shell腳本,自己感覺挺有難度的,今天就簡單整理一些shell腳本的練習和作業 練習:    1、編寫腳本/root/bin/systeminfo.sh,顯示當前主機系統信息,包括主機名,IPv4地址,操作系統版本,內核版本,CPU型號,內存大小,硬盤大小。#!/bin/bash# ———&#…

    2017-08-05
欧美性久久久久