tomcat

 
 編程語言:
硬件級:微碼編程,匯編語言
系統級:C,C++,…
應用級:Java, PHP, Python, Ruby, Perl, C#, …
Python: PVM
Standard Library
Web Framework:Django, Flask, …
Java:JVM,JDK
bash:bash explainer

程序:指令+數據
過程式編程:以指令為中心,數據服務于代碼;
對象式編程:以數據為中心,指令服務于數據;
對象,方法(method)

Java:
Sun, Green Project, Oak,  James Gosling;
1995:Java 1.0, Write once, Run Anywhere;
1996:JDK(Java Development Kit),包含類庫、開發工具(javac)、JVM(SUN Classic VM)
JDK 1.0,  Applet, AWT
1997:JDK 1.1
1998: JDK  1.2
Sun分拆Java技術為三個方向:
J2SE:Standard Edition
J2EE:Enterprise Edition
J2ME:Mobile Edition

代表性技術:EJB,java plugin, Swing, JIT(Just In Time,即時編譯)

2000:JDK 1.3
HotSpot VM
2002:JDK 1.4

2006:Sun開源了Java技術,GPL,建立一個稱為OpenJDK組織;
Java 2 SE, Java 2 EE, Java 2 ME

2011:JDK 1.7
2014:JDK 1.8
2016:JDK 1.9

Java代碼的運行:
*.java(source code) –> javac –> *.class(bytecode)
jvm:class loader,加載程序的類文件,及程序的類文件依賴到的其它的類文件而后運行; 整個運行表現為一個jvm進程;
threads;

java技術體系:
Java編程語言
Java Class文件格式
Java API 
Java VM 
class loader
執行引擎

JVM運行時區域:
方法區:線程共享; 用于存儲被JVM加載的class信息、常量、靜態變量、方法等;
堆:是jvm所管理的內存中占用空間最大的一部分;也是GC管理的主要區域;存儲對象;
Java棧:線程私有,存儲 線程自己的局部變量;
PC寄存器:線程私有的內存空間,程序的指令指針;
本地方法棧:

安裝JDK
了解當前的java環境:
~]# java  -version
 
OpenJDK: 
java-VERSION-openjdk:
The OpenJDK runtime environment.
java-VERSION-openjdk-headless:
The OpenJDK runtime environment without audio and video support.
java-VERSION-openjdk-devel:
The OpenJDK development tools.

CentOS 7:
VERSION:1.6.0, 1.7.0, 1.8.0

注意:多版本并存時,可使用 alternatives命令設定默認使用的版本;

Oracle JDK:
安裝相應版本的rpm包;
jdk-VERSION-OS-ARCH.rpm
例如:jdk-1.8.0_25-linux-x64.rpm 

注意:安裝完成后,要配置JAVA_HOME環境變量,指向java的安裝路徑;
OpenJDK:
JAVA_HOME=/usr
Oracle JDK:
JAVA_HOME=/usr/java/jdk_VERSION

Java 2 EE:
CGI: Common Gateway Interface

Servlet:
類庫;web app;
Servlet container, Servlet Engine

JSP: Java Server Page
<html>
<title>TITLE</title>
<body>
<h1>…</h1>
<%
… java code…
%>
</body>
</html>

.jsp –>jasper–> .java –> javac –> .class –> jvm 

注意:基于jasper將靜態輸出的數據轉為java代碼進行輸出,結果為servlet規范的代碼;

JSP Container:
JSP + Servlet Container

Java Web Server:JWS
ASF:JServ

Tomcat 3.x
Tomcat 4.x
Catalina

http://tomcat.apache.org/

商業實現:
WebSphere, WebLogic, Oc4j, Glassfish, Geronimo, JOnAS, JBoss, …
開源實現:
Tomcat, Jetty, Resin, …

Tomcat: Java 2 EE技術體系的不完整實現; 

回顧:
java技術體系:
Java編程語言、Java Class文件格式、Java API、JVM 

java的技術方向:
J2SE –> JAVA 2 SE, JDK
j2EE –> JAVA 2 EE, 
Servlet, JSP, JMX, …
J2ME –> JAVA 2 ME

Servlet Container:
JDK + Servlet 

JSP Container:
JSP + Servlet Container

JVM運行時區域:方法區、堆、Java棧、PC寄存器、本地方法棧;

Tomcat:事先部署JDK;
Java 2 EE不完整實現;

Tomcat(2)

Tomcat:
使用java語言編寫:

Tomcat的核心組件:server.xml
<Server>
<Service>
<connector/>
<connector/>

<Engine>
<Host>
<Context/>
<Context/>

</Host>
<Host>

</Host>

</Engine>
</Service>
</Server>

每一個組件都由一個Java“類”實現,這些組件大體可分為以下幾個類型:
頂級組件:Server
服務類組件:Service
連接器組件:http, https, ajp
容器類:Engine, Host, Context
被嵌套類:valve, logger, realm, loader, manager, …
集群類組件:listener, cluster, …

安裝Tomcat:
Base Repo:
tomcat, tomcat-lib, tomcat-admin-webapps, tomcat-webapps, tomcat-docs-webapp

Tomcat binary release:

tar xf apache-tomcat-VERSION.tar.gz  -C /usr/local/

cd /usr/local

ln -sv apache-tomcat-VERSION  tomcat

/etc/profile.d/tomcat.sh 
export CATALINA_BASE=/usr/local/tomcat
export PATH=$CATALINA_BASE/bin:$PATH

tomcat程序環境:

tomcat的目錄結構
bin:腳本,及啟動時用到的類;
conf:配置文件目錄;
lib:庫文件,Java類庫,jar;
logs:日志文件目錄;
temp:臨時文件目錄;
webapps:webapp的默認目錄;
work:工作目錄;

rpm包安裝的程序環境:
配置文件目錄:/etc/tomcat
主配置文件:server.xml 
webapps存放位置:/var/lib/tomcat/webapps/
examples
manager
host-manager
docs
Unit File:tomcat.service
環境配置文件:/etc/sysconfig/tomcat

tomcat的配置文件:
server.xml:主配置文件;
web.xml:每個webapp只有“部署”后才能被訪問,它的部署方式通常由web.xml進行定義,其存放位置為WEB-INF/目錄中;此文件為所有的webapps提供默認配置;
context.xml:每個web都可以專用的配置文件,它通常由專用的配置文件context.xml來定義,其存放位置為WEB-INF/目錄中;此文件為所有的webapps提供默認配置;
tomcat-users.xml:用戶認證的賬號和密碼文件;
catalina.policy:當使用-security選項啟動tomcat時,用于為tomcat設置安全策略; 
catalina.properties:Java屬性的定義文件,用于設定類加載器路徑,以及一些與JVM調優相關參數;
logging.properties:日志系統相關的配置;

catalina.sh –help

debug             Start Catalina in a debugger
debug -security   Debug Catalina with a security manager
jpda start        Start Catalina under JPDA debugger
run               Start Catalina in the current window
run -security     Start in the current window with security manager
start             Start Catalina in a separate window
start  -security   Start in a separate window with security manager
stop              Stop Catalina, waiting up to 5 seconds for the process to end
stop n            Stop Catalina, waiting up to n seconds for the process to end
stop -force       Stop Catalina, wait up to 5 seconds and then use kill -KILL if still running
stop n -force     Stop Catalina, wait up to n seconds and then use kill -KILL if still running
configtest        Run a basic syntax check on server.xml – check exit code for result
version           What version of tomcat are you running?

JSP WebAPP的組織結構:
/: webapps的根目錄
index.jsp:主頁;
WEB-INF/:當前webapp的私有資源路徑;通常用于存儲當前webapp的web.xml和context.xml配置文件;
META-INF/:類似于WEB-INF/;
classes/:類文件,當前webapp所提供的類;
lib/:類文件,當前webapp所提供的類,被打包為jar格式;

webapp歸檔格式:
.war:webapp
.jar:EJB的類打包文件;
.rar:資源適配器類打包文件;
.ear:企業級webapp;

部署(deploy)webapp的相關操作:
deploy:將webapp的源文件放置于目標目錄(網頁程序文件存放目錄),配置tomcat服務器能夠基于web.xml和context.xml文件中定義的路徑來訪問此webapp;將其特有的類和依賴的類通過class loader裝載至JVM;
部署有兩種方式:
自動部署:auto deploy
手動部署:
冷部署:把webapp復制到指定的位置,而后才啟動tomcat;
熱部署:在不停止tomcat的前提下進行部署;
部署工具:manager、ant腳本、tcd(tomcat client deployer)等;
undeploy:反部署,停止webapp,并從tomcat實例上卸載webapp;
start:啟動處于停止狀態的webapp;
stop:停止webapp,不再向用戶提供服務;其類依然在jvm上;
redeploy:重新部署;

手動提供一測試類應用,并冷部署:

mkidr  -pv  /usr/local/tomcat/webapps/test/{classes,lib,WEB-INF}

創建文件/usr/local/tomcat/webapps/test/index.jsp 
<%@ page language=”java” %>
<%@ page import=”java.util.*” %>
<html>
<head>
<title>Test Page</title>
</head>
<body>
<% out.println(“hello world”);
%>
</body>
</html>

tomcat的兩個管理應用:
manager
host-manager

tomcat的常用組件配置:

Server:代表tomcat instance,即表現出的一個java進程;監聽在8005端口,只接收“SHUTDOWN”。各server監聽的端口不能相同,因此,在同一物理主機啟動多個實例時,需要修改其監聽端口為不同的端口; 

Service:用于實現將一個或多個connector組件關聯至一個engine組件;

Connector組件:
負責接收請求,常見的有三類http/https/ajp;

進入tomcat的請求可分為兩類:
(1) standalone : 請求來自于客戶端瀏覽器;
(2) 由其它的web server反代:來自前端的反代服務器;
nginx –> http connector –> tomcat 
httpd(proxy_http_module) –> http connector –> tomcat
httpd(proxy_ajp_module) –> ajp connector –> tomcat 

屬性:
port=”8080″ 
protocol=”HTTP/1.1″
connectionTimeout=”20000″

address:監聽的IP地址;默認為本機所有可用地址;
maxThreads:最大并發連接數,默認為200;
enableLookups:是否啟用DNS查詢功能;
acceptCount:等待隊列的最大長度;
secure:
sslProtocol:

Engine組件:Servlet實例,即servlet引擎,其內部可以一個或多個host組件來定義站點; 通常需要通過defaultHost來定義默認的虛擬主機;

屬性:
name=
defaultHost=”localhost”
jvmRoute=

Host組件:位于engine內部用于接收請求并進行相應處理的主機或虛擬主機,示例:
<Host name=”localhost”  appBase=”webapps”
unpackWARs=”true” autoDeploy=”true”>
</Host>

常用屬性說明:
(1) appBase:此Host的webapps的默認存放目錄,指存放非歸檔的web應用程序的目錄或歸檔的WAR文件目錄路徑;可以使用基于$CATALINA_BASE變量所定義的路徑的相對路徑;
(2) autoDeploy:在Tomcat處于運行狀態時,將某webapp放置于appBase所定義的目錄中時,是否自動將其部署至tomcat;

示例:
     <Host name=”tc1.magedu.com” appBase=”/appdata/webapps” unpackWARs=”true” autoDeploy=”true”>
</Host>

mkdir -pv /appdata/webapps

mkdir -pv /appdata/webapps/ROOT/{lib,classes,WEB-INF}

提供一個測試頁即可;

Context組件:
示例:
<Context path=”/PATH” docBase=”/PATH/TO/SOMEDIR” reloadable=””/>

綜合示例:
<Host name=”node1.magedu.com” appBase=”/web/apps” unpackWARs=”true” autoDeploy=”true”>
<Valve className=”org.apache.catalina.valves.AccessLogValve” directory=”logs”
prefix=”node1_access” suffix=”.log”
pattern=”%h %l %u %t &quot;%r&quot; %s %b” />
<Context path=”/test” docBase=”test” reloadable=””>
<Valve className=”org.apache.catalina.valves.AccessLogValve” directory=”logs”
prefix=”node1_test_access_” suffix=”.log”
pattern=”%h %l %u %t &quot;%r&quot; %s %b” />
</Context>
</Host>

Valve組件:
<Valve className=”org.apache.catalina.valves.AccessLogValve” directory=”logs”
prefix=”localhost_access_log” suffix=”.txt”
pattern=”%h %l %u %t &quot;%r&quot; %s %b” />

Valve存在多種類型:
定義訪問日志:org.apache.catalina.valves.AccessLogValve
定義訪問控制:org.apache.catalina.valves.RemoteAddrValve 

<Valve className=”org.apache.catalina.valves.RemoteAddrValve” deny=”172.16.100.67″/>
 

 
LNMT:Linux Nginx MySQL Tomcat 
Client (http) –> nginx (reverse proxy)(http) –> tomcat  (http connector)

location / {
proxy_pass http://tc1.magedu.com:8080;
}

location ~* .(jsp|do)$ {
proxy_pass http://tc1.magedu.com:8080;
}

LAMT:Linux Apache(httpd) MySQL Tomcat 
httpd的代理模塊:
proxy_module
proxy_http_module:適配http協議客戶端;
proxy_ajp_module:適配ajp協議客戶端;

Client (http) –> httpd (proxy_http_module)(http) –> tomcat  (http connector)
Client (http) –> httpd (proxy_ajp_module)(ajp) –> tomcat  (ajp connector)
Client (http) –> httpd (mod_jk)(ajp) –> tomcat  (ajp connector)

proxy_http_module代理配置示例:
<VirtualHost *:80>
ServerName      tc1.magedu.com
ProxyRequests Off
ProxyVia        On
ProxyPreserveHost On
<Proxy *>
Require all granted
</Proxy>
ProxyPass / http://tc1.magedu.com:8080/ 
ProxyPassReverse / http://tc1.magedu.com:8080/ 
<Location />
Require all granted
</Location>
</VirtualHost>

proxy_ajp_module代理配置示例:
<VirtualHost *:80>
ServerName      tc1.magedu.com
ProxyRequests Off
ProxyVia        On
ProxyPreserveHost On
<Proxy *>
Require all granted
</Proxy>
ProxyPass / ajp://tc1.magedu.com:8009/ 
ProxyPassReverse / ajp://tc1.magedu.com:8009/ 
<Location />
Require all granted
</Location>
</VirtualHost>

課外實踐:client –> nginx –> httpd –> tomcat
proxy_http_module)(http) –> tomcat  (http connector)
Client (http) –> httpd (proxy_ajp_module)(ajp) –> tomcat  (ajp connector)
Client (http) –> httpd (mod_jk)(ajp) –> tomcat  (ajp connector)

proxy_http_module代理配置示例:
<VirtualHost *:80>
ServerName      tc1.magedu.com
ProxyRequests Off
ProxyVia        On
ProxyPreserveHost On
<Proxy *>
Require all granted
</Proxy>
ProxyPass / http://tc1.magedu.com:8080/ 
ProxyPassReverse / http://tc1.magedu.com:8080/ 
<Location />
Require all granted
</Location>
</VirtualHost>

proxy_ajp_module代理配置示例:
<VirtualHost *:80>
ServerName      tc1.magedu.com
ProxyRequests Off
ProxyVia        On
ProxyPreserveHost On
<Proxy *>
Require all granted
</Proxy>
ProxyPass / ajp://tc1.magedu.com:8009/ 
ProxyPassReverse / ajp://tc1.magedu.com:8009/ 
<Location />
Require all granted
</Location>
</VirtualHost>

課外實踐:client –> nginx –> httpd –> tomcat

會話保持:
(1) session sticky
source_ip
nginx: ip_hash
haproxy: source
lvs: sh
cookie:
nginx:hash 
haproxy: cookie
(2) session cluster:delta session manager
(3) session server:redis(store), memcached(cache)

Tomcat Cluster(session)
(1) session sticky
(2) session cluster
tomcat delta manager
(3) session server 
memcached

Tomcat Cluster
(1) httpd + tomcat cluster
httpd: mod_proxy, mod_proxy_http, mod_proxy_balancer
tomcat cluster:http connector
(2) httpd + tomcat cluster
httpd: mod_proxy, mod_proxy_ajp, mod_proxy_balancer
tomcat cluster:ajp connector
(3) httpd + tomcat cluster
httpd: mod_jk
tomcat cluster:ajp connector
(4) nginx + tomcat cluster

第一種方法的實現:
<proxy balancer://tcsrvs>
BalancerMember http://172.18.100.67:8080
BalancerMember http://172.18.100.68:8080
ProxySet lbmethod=byrequests
</Proxy>

<VirtualHost *:80>
ServerName lb.magedu.com
ProxyVia On
ProxyRequests Off
ProxyPreserveHost On
<Proxy *>
Require all granted
</Proxy>
ProxyPass / balancer://tcsrvs/
ProxyPassReverse / balancer://tcsrvs/
<Location />
Require all granted
</Location>
</VirtualHost>

會話粘性的實現方法:
Header add Set-Cookie “ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/” env=BALANCER_ROUTE_CHANGED

<proxy balancer://tcsrvs>
BalancerMember http://172.18.100.67:8080 route=TomcatA loadfactor=1
BalancerMember http://172.18.100.68:8080 route=TomcatB loadfactor=2
ProxySet lbmethod=byrequests
ProxySet stickysession=ROUTEID
</Proxy>

<VirtualHost *:80>
ServerName lb.magedu.com
ProxyVia On
ProxyRequests Off
ProxyPreserveHost On
<Proxy *>
Require all granted
</Proxy>
ProxyPass / balancer://tcsrvs/
ProxyPassReverse / balancer://tcsrvs/
<Location />
Require all granted
</Location>
</VirtualHost>

啟用管理接口:
<Location /balancer-manager>
SetHandler balancer-manager
ProxyPass !
Require all granted
</Location>

示例程序:
演示效果,在TomcatA上某context中(如/test),提供如下頁面
<%@ page language=”java” %>
<html>
<head><title>TomcatA</title></head>
<body>
<h1><font color=”red”>TomcatA.magedu.com</font></h1>
<table align=”centre” border=”1″>
<tr>
<td>Session ID</td>
<% session.setAttribute(“magedu.com”,”magedu.com”); %>
<td><%= session.getId() %></td>
</tr>
<tr>
<td>Created on</td>
<td><%= session.getCreationTime() %></td>
</tr>
</table>
</body>
</html>

演示效果,在TomcatB上某context中(如/test),提供如下頁面
<%@ page language=”java” %>
<html>
<head><title>TomcatB</title></head>
<body>
<h1><font color=”blue”>TomcatB.magedu.com</font></h1>
<table align=”centre” border=”1″>
<tr>
<td>Session ID</td>
<% session.setAttribute(“magedu.com”,”magedu.com”); %>
<td><%= session.getId() %></td>
</tr>
<tr>
<td>Created on</td>
<td><%= session.getCreationTime() %></td>
</tr>
</table>
</body>
</html>

第二種方式:
<proxy balancer://tcsrvs>
BalancerMember ajp://172.18.100.67:8009
BalancerMember ajp://172.18.100.68:8009
ProxySet lbmethod=byrequests
</Proxy>

<VirtualHost *:80>
ServerName lb.magedu.com
ProxyVia On
ProxyRequests Off
ProxyPreserveHost On
<Proxy *>
Require all granted
</Proxy>
ProxyPass / balancer://tcsrvs/
ProxyPassReverse / balancer://tcsrvs/
<Location />
Require all granted
</Location>
<Location /balancer-manager>
SetHandler balancer-manager
ProxyPass !
Require all granted
</Location>
</VirtualHost>

保持會話的方式參考前一種方式。

Tomcat Session Replication Cluster:
(1) 配置啟用集群,將下列配置放置于<engine>或<host>中;
<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”>
<Membership className=”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″/>

<Sender className=”org.apache.catalina.tribes.transport.ReplicationTransmitter”>
<Transport className=”org.apache.catalina.tribes.transport.nio.PooledParallelSender”/>
</Sender>
<Interceptor className=”org.apache.catalina.tribes.group.interceptors.TcpFailureDetector”/>
<Interceptor className=”org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor”/>
</Channel>

<Valve className=”org.apache.catalina.ha.tcp.ReplicationValve”
filter=””/>
<Valve className=”org.apache.catalina.ha.session.JvmRouteBinderValve”/>

<Deployer className=”org.apache.catalina.ha.deploy.FarmWarDeployer”
tempDir=”/tmp/war-temp/”
deployDir=”/tmp/war-deploy/”
watchDir=”/tmp/war-listen/”
watchEnabled=”false”/>

<ClusterListener className=”org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener”/>
<ClusterListener className=”org.apache.catalina.ha.session.ClusterSessionListener”/>
</Cluster>

確保Engine的jvmRoute屬性配置正確。

(2) 配置webapps
編輯WEB-INF/web.xml,添加<distributable/>元素;

Tomcat的常用優化配置:
(1) 內存空間:
/etc/sysconfig/tomcat
JAVA_OPTS=”-server -Xms -Xmx -XX:NewSize= -XX:MaxNewSize= -XX:PermSize= -XX:MaxPermSize=”
-server:服務器模型
-Xms:堆內存初始化大小;
-Xmx:堆內存空間上限;
-XX:NewSize=:新生代空間初始化大小;
-XX:MaxNewSize=:新生代空間最大值;
-XX:PermSize=:持久代空間初始化大小;
-XX:MaxPermSize=:持久代空間最大值; 

(2) 線程池設置:
<Connector port=”8080″ protocol=”HTTP/1.1″  connectionTimeout=”20000″ redirectPort=”8443″ />

常用屬性:
maxThreads:最大線程數;
minSpareThreads:最小空閑線程數;
maxSpareThreads:最大空閑線程數;
acceptCount:等待隊列的最大長度;
URIEncoding:URI地址編碼格式,建議使用UTF-8;
enableLookups:是否啟用dns解析,建議禁用; 
compression:是否啟用傳輸壓縮機制,建議“on”;
compressionMinSize:啟用壓縮傳輸的數據流最小值,單位是字節;
compressableMimeType:定義啟用壓縮功能的MIME類型;
text/html, text/xml, text/css, text/javascript

(3) 禁用8005端口;
<Server port=”-1″ shutdown=”SHUTDOWN”>

(4) 隱藏版本信息:
<Connector port=”8080″ protocol=”HTTP/1.1″  connectionTimeout=”20000″ redirectPort=”8443″ />

Server=”SOME STRING”

Tomcat Session Server (memcached)

https://github.com/magro/memcached-session-manager

支持的session server類型:
memcached:
couchbase:
redis:

博客作業:tomcat
(1) nginx + tomcat cluster, httpd(proxy_http_module)+tomcat cluster, httpd(proxy_ajp_module)+tomcat cluster;
特別說明會話保持的實現方式;
(2) tomcat cluster升級為session cluster, 使用deltaManager;
(3) tomcat cluster將會話保存至memcached中;

JVM常用的分析工具: 
jps:用來查看運行的所有jvm進程;
jinfo:查看進程的運行環境參數,主要是jvm命令行參數;
jstat:對jvm應用程序的資源和性能進行實時監控;
jstack:查看所有線程的運行狀態;
jmap:查看jvm占用物理內存的狀態;
jconsole:
jvisualvm:

jps:Java virutal machine Process Status tool,
jps [-q] [-mlvV] [<hostid>]
-q:靜默模式;
-v:顯示傳遞給jvm的命令行參數;
-m:輸出傳入main方法的參數;
-l:輸出main類或jar完全限定名稱;
-V:顯示通過flag文件傳遞給jvm的參數;
[<hostid>]:主機id,默認為localhost;

jinfo:輸出給定的java進程的所有配置信息;
jinfo [option] <pid>
-flags:to print VM flags
-sysprops:to print Java system properties
-flag <name>:to print the value of the named VM flag

jstack:查看指定的java進程的線程棧的相關信息;
jstack [-l] <pid>
jstack -F [-m] [-l] <pid>
-l:long listings,會顯示額外的鎖信息,因此,發生死鎖時常用此選項;
-m:混合模式,既輸出java堆棧信息,也輸出C/C++堆棧信息;
-F:當使用“jstack -l PID”無響應,可以使用-F強制輸出信息;

jstat:輸出指定的java進程的統計信息
jstat -help|-options
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

jstat -options

-class:class loader
-compiler:JIT
-gc:gc
-gccapacity:統計堆中各代的容量
-gccause:
-gcmetacapacity
-gcnew:新生代
-gcnewcapacity
-gcold:老年代
-gcoldcapacity
-gcutil
-printcompilation

[<interval> [<count>]]
interval:時間間隔,單位是毫秒;
count:顯示的次數;

-gc:
YGC:新生代的垃圾回收次數;
YGCT:新生代垃圾回收消耗的時長; 
FGC:Full GC的次數;
FGCT:Full GC消耗的時長;
GCT:GC消耗的總時長;

jmap:Memory Map, 用于查看堆內存的使用狀態; 
jhat:Java Heap Analysis Tool
jmap [option] <pid>

查看堆空間的詳細信息:
jmap -heap <pid>

查看堆內存中的對象的數目:
jmap -histo[:live] <pid>
live:只統計活動對象;

保存堆內存數據至文件中,而后使用jvisualvm或jhat進行查看:
jmap -dump:<dump-options> <pid>
dump-options:
live         dump only live objects; if not specified, all objects in the heap are dumped.
format=b     binary format
file=<file>  dump heap to <file>

課外作業:了解何為full gc,如何應對;

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

原創文章,作者:shewei,如若轉載,請注明出處:http://www.www58058.com/76698

(0)
sheweishewei
上一篇 2017-05-22
下一篇 2017-05-22

相關推薦

  • iptables的DNAT、SNAT配置

    DNAT:目的地址轉換。當外網主機訪問內網的某臺服務器的時候,如果直接暴露服務器的IP于公網,可能會遭受各種各樣的攻擊,而DNAT的主要作用就是在服務器前面添加一臺防火墻。將防火墻的地址公布出去,讓外網客戶端通過訪問防火墻的地址就可以訪問到本地服務器。這樣就起到了保護服務器的目的; SNAT:源地址轉換。內網主機在訪問互聯網的時候所有源地址都轉換為防火墻的外…

    2017-06-12
  • 細節決定成敗–空格的巨大作用以及正則表達式中元字符的轉義

    字符串的條件判定 1.字符串判定 一定要用雙[[ ]] 2.字符串判定=~默認支持擴展正則表達式,這里注意雙引號的使用 僅僅做是否包含時,有無雙引號無區別。 但是利用其他擴展表達式時 雙引號一定要去掉 錨定示例 多條件判定時-o -a使用時,不能使用雙中括號 空格有無的差別 !的使用細節 !到目前為止 有兩種意義 條件判定取反 歷史命令的調用 兩者的使用卻別…

    2017-03-19
  • Linux程序包管理相關

    前言 首先說說一個軟件的誕生過程: 程序員用編程語言寫文本格式的源代碼,但是計算機只能讀懂二進制文件,那么就需要將源代碼轉換成二進制格式,這個過程稱為編譯。編譯用的工具稱為編譯器,編譯器有很多種,在Linux上常用gcc這個編譯器。利用編譯器,得到二進制格式的文件(二進制程序(Windows上.exe.msi,Linux.elf)、庫文件、配置文件、幫助文件…

    Linux干貨 2018-01-04
  • N26-第七周博客作業

    一、創建一個10G分區,并格式為ext4文件系統; 1、 要求其block大小為2048, 預留空間百分比為2, 卷標為MYDATA, 默認掛載屬性包含acl;          A、創建一個10G的磁盤空間 [root@VM_221_40_centos ~]#fdisk /de…

    2017-07-09
  • thinkpad e420編譯安裝thinkfan控制風扇

    我的筆記本是win7+linuxmint雙系統,在進入linuxmint長時間運行后會明顯感覺發熱,我發現筆記本風扇的轉數過低,導致熱量不能發散出去,解決方法就是安裝thinkfan風扇控制軟件。 1、下載軟件包 https://sourceforge.net/projects/thinkfan/ 最新版本是1.0beta2 2、編譯安裝 編譯前確保安裝過c…

    Linux干貨 2017-03-09
欧美性久久久久