2:數據庫自身有不少緩存機制,可以使用應對的緩存策略 html
4:對請求來講,能夠實現讀寫分離,對讀請求進行負載均衡 linux
1,水平拆分:將一個大數據表拆分紅若干個小表; 例如:一個表中有10億條記錄,將着10億條記錄分紅10萬條記錄爲一個表 github
應用級:Java PHP Python Ruby Perl C#,.....
面向對象:以數據爲中心,面向對象從另外一個角度解決這個問題,它拋棄了函數,把對象做爲程序的基本單元;對象就是對事物的一種抽象描述
面向過程:以指令爲中心;面向過程的設計思路就是首先分析問題的步驟
PHP:適合快速開發,中小型應用系統,開發成本低,可以對變更的需求作出快速的反應
Java:適合與開發大型的應用系統,應用的前景比較開闊,系統容易維護,可複用性較好。
1:J2SE----Java standard edition 標準版本,這個是下面兩個的基礎 ; 通常是位於客戶端的應用
2:J2ME----Java Micro edition 通常位於嵌入式應用,例如手機遊戲
3:J2EE-----Java Enterprise Edition 通常爲服務器端的應用:例如JSP站點
J2EE 規範包含Servlet,主要是爲了擴展java做爲web服務的功能,他的做用就是爲java程序提供 一個統一的web應用的規範,方便程序員統一的使用這種規範來編寫程序,應用容器可使用提供的規範來實現本身的特性。
web服務器習慣處理靜態頁面,因此須要一個程序來幫忙處理動態請求(如
當前時間)。Web服務器程序會將動態請求轉發給幫助程序,幫助程序處理
後,返回處理後的靜態結果給web服務器程序。這樣就避免了web服務器
Web服務器接收到該請求後,並非將請求直接交給Servlet,而是交給Servlet容器。Servlet容器實例化Servlet,調用Servlet的一個特定方法對請求進行處理, 併產生一個響應。這個響應由Servlet容器返回給Web服務器,Web服務器包裝這個響應,以HTTP響應的形式發送給Web瀏覽
因爲Web服務提供的是靜態頁面,Web將動態頁面發送給Servlet,Servlet容器實例化Servlet,調用Servlet的一個特定方法對請求進行處理, 併產生一個響應
生成靜態頁面,返還給Web服務端,Web服務端,再將這個結果響應給客戶端既瀏覽器
Java Servlet(Java服務器小程序)是一個基於Java技術的Web組件,運行在服務器端,它由Servlet容器所管理,用於生成動態的內容。 Servlet是平臺獨立的Java類,編寫一個Servlet,實際上就是按照Servlet規範編寫一個Java類。Servlet被編譯爲平臺獨立 的字節碼,能夠被動態地加載到支持Java技術的Web服務器中運行。
Servlet容器也叫作Servlet引擎,是Web服務器或應用程序服務器的一部分,用於在發送的請求和響應之上提供網絡服務,解碼基於 MIME的請求,格式化基於MIME的響應。Servlet沒有main方法,不能獨立運行,它必須被部署到Servlet容器中,由容器來實例化和調用 Servlet的方法(doGet()doPost()),Servlet容器在Servlet的生命週期內包容和管理Servlet。在JSP術 推出後,管理和運行Servlet/JSP的容器也稱爲Web容器。
有了servlet以後,用戶經過單擊某個連接或者直接在瀏覽器的地址欄中輸入URL來訪問Servlet,Web服務器接收到該請求後,並非將請求直接交給Servlet,而是交給Servlet容器。Servlet容器實例化Servlet,調用Servlet的一個特定方法對請求進行處理, 併產生一個響應。這個響應由Servlet容器返回給Web服務器,Web服務器包裝這個響應,以HTTP響應的形式發送給Web瀏覽
通訊支持:利用容器提供的方法,你能輕鬆的讓servlet與web服務器對話,而不用本身創建serversocket、監聽某個端口、建立流等 等。容器知道本身與web服務器之間的協議,因此你的servlet不用擔憂web服務器(如Apache)和你本身的web代碼之間的API,只須要考 慮如何在servlet中實現業務邏輯(如處理一個訂單)。
生命週期管理:servlet容器控制着servlet的生與死,它負責加載類、實例化和初始化servlet,調用servlet方法,以及使servlet實例被垃圾回收,有了servlet容器,你不須要太多的考慮資源管理。
多線程支持:容器會自動爲它所接收的每一個servlet請求建立一個新的java線程。針對用戶的請求,若是servlet已經運行完相應的http服務方法,這個線程就會結束。這並非說你不須要考慮線程安全性,其實你還會遇到同步問題,不過這樣能使你少作不少工做。
聲明方式實現安全:利用servlet容器,你可使用xml部署描述文件來配置和修改安全性,而沒必要將其硬編碼寫到servlet類代碼中。
JSP支持:servlet容器負責將jsp代碼翻譯爲真正的java代碼。
(2)catalina --- 一個servlet容器-----處理servlet;
(3)還有就是JSP容器,它就是把jsp頁面翻譯成一個Servlet。
JSP在本質上就是Servle,可是二者的建立方式不同。Servlet都是由Java程序代碼構成,用於流程控制和事務處理,經過Servlet來生成動態網頁很不直觀。而JSP由HTML代碼和JSP標籤構成,能夠方便的編寫動態網頁。
編譯:JSP修改後能夠當即看到結果,不須要編譯;而Servlet須要編譯
轉換:JSP是動態網頁開發技術,是運行在服務器端的腳本語言;而Servlet是Web服務器端編程技術。
因此JSP運行時就是轉換爲Servlet,也就是JAVA程序來執行。
通俗而言:jsp就是在html裏面寫java代碼,servlet就是在java裏面寫html代碼…其實jsp通過容器解釋以後就是servlet.
1)客戶端(一般都是瀏覽器)訪問web服務器,發送HTTP請求
3)Servlet容器加載Servlet,產生Servlet實例後,向其傳遞表示請求和相應的對象。
4) Servlet實例使用請求對象獲得客戶端的信息,而後進行相應的處理
5)Servlet實例將處理結果經過響應對象發送回客戶端,容器負責確保響應正確送出,同時將控制返回給Web服務器
JRE:是Java運行環境,包含了Java虛擬機,Java基礎類庫。是使用Java語言編寫的程序運行所須要的軟件環境,是提供給想運行Java程序的用戶使用的。
JDK:是Java開發工具包,是程序員使用Java語言編寫Java程序所需的開發工具包,是提供給程序員使用的。JDK包含了JRE,同時還包含了編譯Java源碼的編譯器Javac,還包含了不少Java程序調試和分析分工具::jconsole,jvisualvm等工具軟件,還包含了java程序編寫所需的文檔和demo例子程序。若是你須要運行Java程序,只須要安裝JRE就好了;若是你須要編寫Java程序,須要安裝JDK
JRE根據不一樣操做系統(如:windows,linux等)和不一樣JRE提供商(IBM,ORACLE等)有不少版本,最經常使用的是Oracle公司收購SUN公司的JRE版本。
Tomcat做爲獨立的Web服務器來單獨運行,Servlet容器組件做爲Web服務器中的一部分而存在,這是Tomcat的默認工做模式。在這種工做模式下,Tomcat是一個獨立運行JAVA程序,須要啓動一個Java虛擬機進程來運行Tomcat.
在這種模式下,Tomcat分爲Web服務器插件和Serlvet容器組件兩部分。
Web服務器插件在其餘的web服務器進程外部地址空間啓動一個Java虛擬機,Swevlet容器組件在此java虛擬機中運行。。若有客戶端發出調用Serlvet
請求,Web服務器插件得到對此請求的控制並轉發給Servlet容器組件(採用IPC通信機制,即進程間通訊的一種機制)。
例如:jdk-1.8.0_25-linux-x64.rpm centos7系統自帶
yum -y install java-1.8.0-openjdk-devel
注意:安裝完成後,要配置JAVA_HOME環境變量,指向java的安裝路徑;
rpm -ivh jdk-8u144-linux-x64.rpm
JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.102-4.b14.el7.x86_64
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
一、從官網下載tomcat二進制安裝包(http://tomcat.apache.org/
http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-
8/v8.5.11/bin/apache-tomcat-8.5.11.tar.gz
#tar xvf apache-tomcat-8.5.11.tar.gz -C /usr/local/
#chmod +x /etc/profile.d/tomcat.sh
#source /etc/profile.d/tomcat.sh
#/usr/local/tomcat/bin/catalina.sh start 或 #catalina.sh start
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
yum install tomcat -y #安裝tomcat主程序
yum install -y tomcat-admin-webapps tomcat-docs-webapp tomcatwebapps
mkdir /var/lib/tomcat/webapps/{ROOT,test}/{WEB-INF,METAINF,
classes,lib} -pv #建立頁面所須要的工做目錄
webapps存放位置:/var/lib/tomcat/webapps/
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
環境配置文件:/etc/sysconfig/tomcat #調整jdk內存使用大小等初始值
六、經過瀏覽器訪問測試(需指定8080端口),注意selinux與
webapps:網站代碼 webapp的默認目錄;網站源文件
web.xml:Web應用程序描述文件,能夠設置tomcat支持的文件類型,都是關因而
tomcat-users.xml:用戶認證的帳號和密碼文件;角色(role),用戶(User);
catalina.policy:當使用-security選項啓動tomcat時,用於爲tomcat設置安全策
catalina.properties:Java屬性的定義文件,用於設定類加載器路徑,以及一些與
Server:Server表示整個的Catalina Servlet容器。Tomcat提供了Server接口的一個默認實現,這一般不需
要用戶本身去實現。在Server容器中,能夠包含一個或多個Service組件。表明tomcat instance,即表現出
的一個java進程;監聽在8005端口,只接收"SHUTDOWN"。各server監聽的端口不能相同,所以,在同
一物理主機啓動多個實例時,須要修改其監聽端口爲不一樣的端口;
Service:Service是存活在Server內部的中間組件,它將一個或多個鏈接器(Connector)組件綁定到一個
單獨的引擎(Engine)上。用於實現將一個或多個connector組件關聯至一個engine組件;
Connector組件:鏈接器(Connector)處理與客戶端的通訊,它負責接收客戶請求,以及向客戶返回響應
結果。在Tomcat中,有多個鏈接器可使用。常見的有三類http/https/ajp;
Engine組件:在Tomcat中,每一個Service只能包含一個Servlet引擎(Engine)。引擎表示一個特定的
Service的請求處理流水線。做爲一個Service能夠有多個鏈接器,引擎從鏈接器接收和處理全部的請求,將
響應返回給適合的鏈接器,經過鏈接器傳輸給用戶。Servlet實例,即servlet引擎,其內部能夠一個或多個
Host組件:位於engine內部用於接收請求並進行相應處理的主機或虛擬主機 相似 nginx server
Context組件 一個Context表示了一個Web應用程序,運行在特定的虛擬主機中,一個Host能夠包含多個
Context(表明Web應用程序) 相似nginx location
每個組件都由一個Java"類"實現,這些組件大致可分爲如下幾個類型:
鏈接器組件:http, https, ajp(apache jserv protocol)
容器類:Engine, Host, Context 部署應用程序的組件
被嵌套類:valve, logger, realm, loader, manager, …
...W EB-INF/:當前webapp的私有資源路徑;一般用於存儲當前webapp的web.xml和
lib/:類文件,當前webapp所提供的類,被打包爲jar格式;
.jar: Java應用程序歸檔,EJB的類打包文件(類庫);
%b - 發送的字節數,不包括HTTP頭,或" - "若是沒有發送字節
%l (小寫的L)- 遠程邏輯從identd的用戶名(老是返回' - ')
%q - 查詢字符串(在前面加上一個"?"若是它存在,不然是一個空字符串
deploy:將webapp的源文件放置於目標目錄(網頁程序文件存放目錄),配置tomcat服務器能
夠基於web.xml和context.xml文件中定義的路徑來訪問此webapp;將其特有的類和依賴的
冷部署:把webapp複製到指定的位置,然後才啓動tomcat;
部署工具:manager、ant腳本、tcd(tomcat client deployer)等;
undeploy:拆除(反部署),中止webapp,並從tomcat實例上卸載webapp;
stop:中止webapp,再也不向用戶提供服務;其類依然在jvm上;
如下是Tomcat Manager 4種角色的大體介紹(下面URL中的*爲通配符):
容許訪問html接口(即URL路徑爲/manager/html/*)
容許訪問純文本接口(即URL路徑爲/manager/text/*)
容許訪問JMX代理接口(即URL路徑爲/manager/jmxproxy/*)
容許訪問Tomcat只讀狀態頁面(即URL路徑爲/manager/status/*)
admin-gui(HTML UI接口)或admin-script(純文本接口)。即URL路徑爲/hostmanager
目前公司和企業使用的Web服務器還有WebSphere,WebLogic,Jetty,JBoss等
Tomcat的性能已經可以知足咱們的要求,所以大多數企業中的開
發者或者小公司仍是經常使用Tomcat做爲應用服務器。這些也是servlet容器
Server:表明tomcat instance,即表現出的一個java進程;監聽在8005端口,只接收"SHUTDOWN"。各server監聽的
端口不能相同,所以,在同一物理主機啓動多個實例時,須要修改其監聽端口爲不一樣的端口;
Service:用於實現將一個或多個connector組件關聯至一個engine組件;
負責接收請求,常見的有三類http/https/ajp;(AJP(Apache JServ Protocol)是定向包協議。由於性能緣由,使用二進
制格式來傳輸可讀性文本。WEB服務器經過 TCP鏈接 和 SERVLET容器鏈接。)
redirectPort="8443" 須要安全通訊的場合,將把客戶請求轉發至SSL的redirectPort端口
Engine組件:Servlet實例,即servlet引擎,其內部能夠一個或多個host組件來定義站點; 一般須要經過defaultHost來定
Host組件:位於engine內部用於接收請求並進行相應處理的主機或虛擬主機,示例:
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
(1) appBase:此Host的webapps的默認存放目錄,指存放非歸檔的web應用程序的目錄或歸檔的WAR文件目錄路徑;能夠
使用基於$CATALINA_BASE變量所定義的路徑的相對路徑;
(2) autoDeploy:在Tomcat處於運行狀態時,將某webapp放置於appBase所定義的目錄中時,是否自動將其部署至
(3)unpackWARs="true" 則tomcat會自動將WAR文件解壓,不然不解壓,直接從WAR文件中運行應用程序
<Context path="/PATH" docBase="/PATH/TO/SOMEDIR" />
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
定義訪問日誌:org.apache.catalina.valves.AccessLogValve
定義訪問控制:org.apache.catalina.valves.RemoteAddrValve
<Valve className="org.apache.catalina.valves.RemoteAddrValve" deny="172\.16\.100\.67"/>
LNMT動態請求經過 tomcat 中的servlet處理的
Client (http) --> nginx (reverse proxy)(http) --> tomcat (http connector)
proxy_pass http://tc1.magedu.com:8080;
proxy_pass http://tc1.mage du.com:8080;
反向代理:客戶端將請求發送給nginx,Nginx再將請求發送給tomcat
基於source_ip nginx: ip_hash haproxy: source lvs: sh
基於cookie:nginx:sticky haproxy: cookie
(2) session cluster:delta session manager
(3) session server:redis(store), memcached(cache
DeltaManager會話管理器是tomcat默認的集羣會話管理器;它主要用於集羣中各個節點之間會話狀態的同步維護
全部的節點都是tomcat,當客戶端向其中一個節點發送請求時,tomcat會建立一個session,在tomcat中有一個session管理機制,經過組播,會向全部的節點發廣播,其餘節點收到廣播以後,會將這個session複製一份,存到本身的機器上。
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8">
<Manager className="org.apache.catalina.ha.session.DeltaManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"/>
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<MembershipclassName="org.apache.catalina.tribes.membership.McastService" address="228.0.0.4" port="45564" frequency="500" dropTime="3000"/>
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="auto" port="4000" autoBind="100" selectorTimeout="5000" maxThreads="6"/>
<SenderclassName="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter="/"/>
<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
Cluster(集羣,族) 節點,若是你要配置tomcat集羣,則須要使用此節點.
className 表示tomcat集羣時,之間相互傳遞信息使用那個類來實現信息
channelSendOptions能夠設置爲二、四、八、10,每一個數字表明一種方式
2 = Channel.SEND_OPTIONS_USE_ACK(確認發送)
4 = Channel.SEND_OPTIONS_SYNCHRONIZED_ACK(同步發送)
8 = Channel.SEND_OPTIONS_ASYNCHRONOUS(異步發送)
在異步模式下,能夠經過加上確認發送(Acknowledge)來提升可靠性,此
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
Manger對象用於實現HTTP會話管理的功能,Tomcat中有5種Manger的實現:
Tomcat6的默認會話管理器,用於非集羣環境中對單個處於運行狀態的Tomcat實例會話
進行管理。當Tomcat關閉時,這些會話相關的數據會被寫入磁盤上的一個名叫
SESSION.ser的文件,並在Tomcat下次啓動時讀取此文件。
當一個會話長時間處於空閒狀態時會被寫入到swap會話對象,這對於內存資源比較吃緊
用於Tomcat集羣的會話管理器,與DeltaManager不一樣的是,某節點會話的改變只會同
className-指定實現org.apache.catalina.ha.ClusterManager接口的類,信息之間的管
expireSessionsOnShutdown-設置爲true時,一個節點關閉,將致使集羣下的全部
notifyListenersOnReplication-集羣下節點間的Session複製、刪除操做,是否通知
<Manager className="org.apache.catalina.ha.session.DeltaManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"/>
Channel是Tomcat節點之間進行通信的工具。Channel包括4個組件:
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
Membership:維護集羣的可用節點列表,它能夠檢查到新增的節點,也能夠檢查到沒有心跳的節點
frequency-發送心跳(向組播地址發送UDP數據包)的時間間隔(單位:ms)。默認值爲500
dropTime-Membership在dropTime(單位:ms)內未收到某一節點的心跳,則將該節點從可用節點
注: 組播(Multicast):一個發送者和多個接收者之間實現一對多的網絡鏈接。
一個發送者同時給多個接收者傳輸相同的數據,只需複製一份相同的數據包。
相同組播地址、端口的Tomcat節點,能夠組成集羣下的子集羣
<Membership className="org.apache.catalina.tribes.membership.McastService"
接收器分爲兩種:BioReceiver(阻塞式)、NioReceiver(非阻塞式)
若是port爲4000,autoBind爲100,接收器將在4000-4099間取一個端口,進行監聽
selectorTimeout-NioReceiver內輪詢的超時時間
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
Sender內嵌了Transport組件,Transport真正負責發送消息
<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
Transport分爲兩種:bio.PooledMultiSender(阻塞式)、nio.PooledParallelSender(非阻塞式)
<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
TcpFailureDetector-網絡、系統比較繁忙時,Membership可能沒法及時更新可用節點列表,
此時TcpFailureDetector能夠攔截到某個節點關閉的信息,
並嘗試經過TCP鏈接到此節點,以確保此節點真正關閉,從而更新集羣能夠用節點列表
className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
MessageDispatch15Interceptor-查看Cluster組件發送消息的方式是否設置爲
Channel.SEND_OPTIONS_ASYNCHRONOUS(Cluster標籤下的channelSendOptions爲8時)。 設
置爲Channel.SEND_OPTIONS_ASYNCHRONOUS時,
MessageDispatch15Interceptor先將等待發送的消息進行排隊,而後將排好隊的消息轉給Sender
className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
ClusterListener : 監聽器,監聽Cluster組件接收的消息
使用DeltaManager時,Cluster接收的信息經過ClusterSessionListener傳遞給DeltaManager
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
<head><title>TomcatB</title></head>
<h1><font color="blue">TomcatB </h1>
<table align="centre" border="1">
<% session.setAttribute("abc","abc"); %>
<td><%= session.getId() %></td>
<td><%= session.getCreationTime() %></td>
Tomcat Session Server (memcached)
https://github.com/magro/memcached-session-manager
memcached-session-manager-2.1.1.jar
memcached-session-manager-tc7-2.1.1.jar(注意:要根據
msm-javolution-serializer-2.1.1.jar
引用類型的變量,其內存分配在堆上或者常量池(字符串常量、基本數據類型常量)
(主要用於存放對象,存取速度慢,能夠運行時動態分配內存,生存期不須要提早確
基本數據類型的變量(int、short、long、byte、float、double、boolean、char等
)以及對象的引用變量 ,其內存分配在棧上,變量出了做用域就會自動釋放。
棧內存的主要做用是存放基本數據類型和引用變量。棧的內存管理是經過棧的"後進先
(主要用來執行程序,存取速度快,大小和生存期必須肯定,缺少靈活性)
Java垃圾回收器是Java虛擬機(JVM)的三個重要模塊(另外兩個是解釋器和多線程機制)
之一,爲應用程序提供內存的自動分配(Memory Allocation)、自動回收(Garbage
Collect)功能,這兩個操做都發生在Java堆上(一段內存快)。
某一個時點,一個對象若是有一個以上的引用(Rreference)指向它,那麼該對象就爲活
着的(Live),不然死亡(Dead),視爲垃圾,可被垃圾回收器回收再利用。
垃圾回收操做須要消耗CPU、線程、時間等資源,因此容易理解的是垃圾回收操做不
是實時的發生(對象死亡立刻釋放),當內存消耗完或者是達到某一個指標(Threshold,
使用內存佔總內存的比列,好比0.75)時,觸發垃圾回收操做。
有一個對象死亡的例外,java.lang.Thread類型的對象即便沒有引用,只要線程還在運
依據統計分析可知,Java(包括一些其它高級語言)裏面大多數對象生命週期都是短暫的
,因此把Java內存分代管理。分代的目的無非就是爲不一樣代的內存塊運用不一樣的管理
策略(算法),從而最大化性能。相對於年老代,一般年輕代要小不少,回收的頻率高,
速度快。年老代則回收頻率低,耗時長。內存在年輕代裏面分配,年輕代裏面的對象
全部的回收器類型都是基於分代技術。Java HotSpot虛擬機包含三代,年輕代(Young
Generation)、年老代(Old Generation)、永久代(Permanent Generation)。
存儲類、方法以及它們的描述信息。能夠經過-XX:PermSize=64m和-
XX:MaxPermSize=128m兩個可選項指定初始大小和最大值。一般 咱們不須要調節該
參數,默認的永久代大小足夠了,不過若是加載的類很是多,不夠用了,調節最大值
主要存儲年輕代中通過多個回收週期仍然存活從而升級的對象,固然對於一些大的內
存分配,可能也直接分配到永久代(一個極端的例子是年輕代根本就存不下)。
絕大多數的內存分配回收動做都發生在年輕代。以下圖所示, 年輕代被劃分爲三個區域
,原始區(Eden)和兩個小的存活區(Survivor),兩個存活區按功能分爲From和To。絕
大多數的對象都在原始區分配,超過一個垃圾回收操做仍然存活的對象放到存活區。
從年輕代空間(包括 Eden 和 Survivor 區域)回收內存被稱爲 Minor GC。這必定義
當 JVM 沒法爲一個新的對象分配空間時會觸發 Minor GC,好比當 Eden 區滿了。所
全部的 Minor GC 都會觸發"全世界的暫停(stop-the-world)"即中止應用程序的線程。
會伴隨至少一次的 Minor GC 。MajorGC 的速度通常會比 Minor GC 慢 10
當發生Full GC時,也會觸發"全世界的暫停(stop-the-world)"即中止應用程序的
小GC:一個JAVA程序,當一個請求須要NEW一個對象時,須要去新生代中的原始區申請空間,發現滿了,就會啓動垃圾回收機制,回收年輕代中的存活區,若是發現好幾回回收不上來,就會將其轉到老年代。
大GC:經過小GC垃圾回收機制,轉移到大老年代後,若是老年代滿了,就會啓動大GC
jinfo:查看進程的運行環境參數,主要是jvm命令行參數; (能夠查看不少信息結構,主要是排查路徑,變量,操做系統,老年代,新生代大小等有什麼錯誤)
jps:Java virutal machine Process Status tool,jps [-q] [-mlvV] [<hostid>]
jinfo:輸出給定的java進程的全部配置信息;主要查看環境變量
jstack:查看指定的java進程的線程棧的相關信息;(重要的排錯工具)jmap:Memory Map, 用於查看堆內存的使用狀態;(重要的排錯工具)
jstat:輸出指定的java進程的統計信息(重要 的排錯工具)
-l:long listings,會顯示額外的鎖信息,所以,發生死鎖時經常使用此選項;好比block
-m:混合模式,既輸出java堆棧信息,也輸出C/C++堆棧信息;好比在什麼地理位置存了什麼東西
-F:當使用"jstack -l PID"無響應,可使用-F強制輸出信息;
Htop:能夠抓一個JAVA線程來看系統使用狀況;能夠查看哪一個線程是否有異常
jstat:輸出指定的java進程的統計信息(重要 的排錯工具)
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
jmap:Memory Map, 用於查看堆內存的使用狀態;(重要的排錯工具)
這個命令主要用於JAVA開發工做中發現程序很卡,會讓運維打印出來內存的使用狀況
這個命令從內存中查看打印對象內容的詳細信息很是消耗資源,在生產環境中不要隨便用
保存堆內存數據至文件中,然後使用jvisualvm或jhat進行查看:
jmap -dump:<dump-options> <pid>
live dump only live objects; if not specified, all objects in the heap are
file=<file> dump heap to <file>
jmap -dump:format=b,file=dumpFileName
二、tomcat配置文件設置(併發)能夠去共享線程池調節數據大小,通常把最大線程數改爲平常峯值的2倍 最大空閒時間等
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="500" minSpareThreads="20" maxSpareThreads="50"
maxThreads :Tomcat 使用線程來處理接收的每一個請求,這個值表示 Tomcat 可建立的最大的線程
minSpareThreads:最小空閒線程數,Tomcat 啓動時的初始化的線程數,表示即便沒有人使用也
maxSpareThreads:最大備用線程數,一旦建立的線程超過這個值,Tomcat 就會關閉再也不須要
<Connector executor="tomcatThreadPool"
port="8080" protocol="HTTP/1.1"
connectionTimeout="30000" #鏈接超時時間
enableLookups="false" #是否啓用dns解析,建議禁用;
connectionUploadTimeout="150000" #上傳最大超時時間
acceptCount="300" #等待隊列的最大長度; 默認爲100個。
keepAliveTimeout="120000" #長鏈接保持時間
maxKeepAliveRequests="500" # 每一個TCP鏈接接受最大的Http請求數目,當處理一個
keep alive請求達到這個最大值,Tomcat關閉這個鏈接
compression="on" #是否啓用傳輸壓縮機制,建議"on";
compressionMinSize="2048" #啓用壓縮傳輸的數據流最小值,單位是字節
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain,image/gif,i
mage/jpg,image/png" 定義啓用壓縮功能的MIME類型;
Tomcat 啓動命令行中的優化參數,就是 JVM 的優化 。Tomcat 首先跑在 JVM 之上的,由於它
的啓動其實也只是一個 java 命令行,首先咱們須要對這個 JAVA 的啓動命令行進行調優。無論是
YGC 仍是 Full GC,GC 過程當中都會對致使程序運行中中斷,正確的選擇不一樣的 GC 策略,調整
JVM、GC 的參數,能夠極大的減小因爲 GC 工做,而致使的程序運行中斷方面的問題,進而適當
的提升 Java 程序的工做效率。可是調整 GC 是以個極爲複雜的過程,因爲各個程序具有不一樣的特
點,如:web 和 GUI 程序就有很大區別(Web能夠適當的停頓,但GUI停頓是客戶沒法接受的)
,並且因爲跑在各個機器上的配置不一樣(主要 cup 個數,內存不一樣),因此使用的 GC 種類也會
CATALINA_OPTS:用於當 Java 運行時選項"start"或"run"命令執行。
CATALINA_OPTS=" -server -verbose:gc -XX:+PrintGCTimeStamps -Xms1024m -
Xmx1024m -XX:NewSize=341m -XX:MaxNewSize=341m -XX:SurvivorRatio=2 -
XX:PermSize=128m -XX:MaxPermSize=128m -XX:ThreadStackSize=512"
CATALINA_OPTS=" -server -verbose:gc -Xms1024m -Xmx1024m -XX:NewSize=341m -
XX:MaxNewSize=341m -XX:NewRatio=2 -XX:PermSize=128m -XX:MaxPermSize=128m -
XX:ThreadStackSize=512" 將這串代碼加入到配置文件中,增長性能
-server 進入服務器模式,可提高運行時性能和內存管理效率很高
-verbose:gc - 輸出GC詳細信息,能夠了解這些垃圾收集發生的狀況 便於排錯
-Xms:表示 Java 初始化堆的大小,-Xms 與-Xmx 設成同樣的值,避免 JVM 反覆從新申請內存
-Xmx:表示最大 Java 堆大小,當應用程序須要的內存超出堆的最大值時虛擬機就會提示內存溢出
,而且致使應用服務崩潰,所以通常建議堆的最大值設置爲可用內存的最大值的80%。
OOM:內存泄漏;當內存用的過大時,會發生OOM內存泄漏狀況,會強行把這個進程殺死
-XX:NewRatio=2:設置年輕代(包括1個Eden和2個Survivor區)與年老代的比值。表示年輕代
servlet容器,三部分組成:web server ; servlet容器 ;jsp容器
工做原理:處理servlet容器動態請求,經過tomcat加載,把servlet容器動態請求進行編譯處理,而後交給JPM,翻譯成機器碼。
六、tomcat的server.xml配置文件結構是怎樣的?
server service connecter 引擎 host conseat
jstack:查看指定的java進程的線程棧的相關信息;(重要的排錯工具)jmap:Memory Map, 用於查看堆內存的使用狀態;(重要的排錯工具)