tomcat
1,水平拆分:将一个大数据表拆分成若干个小表; 例如:一个表中有10亿条记录,将着10亿条记录分成10万条记录为一个表
应用级:Java PHP Python Ruby Perl C#,.....
面向对象:以数据为中心,面向对象从另一个角度解决这个问题,它抛弃了函数,把对象作为程序的基本单元;对象就是对事物的一种抽象描述
面向过程:以指令为中心;面向过程的设计思路就是首先分析问题的步骤
PHP:适合快速开发,中小型应用系统,开发成本低,能够对变动的需求做出快速的反应
Java:适合与开发大型的应用系统,应用的前景比较开阔,系统容易维护,可复用性较好。
1:J2SE----Java standard edition 标准版本,这个是下面两个的基础 ; 一般是位于客户端的应用
2:J2ME----Java Micro edition 一般位于嵌入式应用,例如手机游戏
3:J2EE-----Java Enterprise Edition 一般为服务器端的应用:例如JSP站点
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
1、从官网下载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内存使用大小等初始值
6、通过浏览器访问测试(需指定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可以设置为2、4、8、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
2、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,翻译成机器码。
6、tomcat的server.xml配置文件结构是怎样的?
server service connecter 引擎 host conseat
jstack:查看指定的java进程的线程栈的相关信息;(重要的排错工具)jmap:Memory Map, 用于查看堆内存的使用状态;(重要的排错工具)