基础
j2ee是一个平台,是一堆技术体的总称;
j2ee是集成多个技术解决思路(标准),并没有全部实现具体代码
具体实现的是服务器,根据对j2ee支持的能力分为两大类
1.JavaEE服务器(应用服务器)
将几乎所有j2ee的技术都实现了,除了jdbc(是数据库需要实现的);
几乎都是收费的;
2.web容器(servlet/jsp容器)
部分实现j2ee的标准(servlet/jsp)
tomcat
jetty
大部分互联网公司,选择开源框架的技术,而不是直接用j2ee标准,一方面原因是j2ee服务器成本;
tomcat 版本
不同版本的tomcat依赖:
JDK:tomcat用jave写的
JavaEE:支持javaee版本的标准
Servlet:支持javaee中servlet版本的标准
Jsp:支持javaee中jsp版本的标准
tomcat:9.x
jdk:8及更改版本
javaee:javaee8
servlet:4.0
jsp:2.47
安装
解压
[root@iZbp14eey5dlgt99xx7qptZ data]# tar -zxvf apache-tomcat-7.0.105.tar.gz -C /usr/local/
配置环境变量
[root@iZbp14eey5dlgt99xx7qptZ apache-tomcat-7.0.105]# vim /etc/profile //export PATH=$PATH:/usr/local/apache-tomcat-7.0.105/bin
source /etc/profile //刷新环境变量
测试
[root@iZbp14eey5dlgt99xx7qptZ conf]# vim server.xml //默认8080端口,修改为80
[root@iZbp14eey5dlgt99xx7qptZ /]# ps -ef|grep tomcat
root 2165 1199 0 16:21 pts/0 00:00:00 grep --color=auto tomcat
[root@iZbp14eey5dlgt99xx7qptZ /]# startup.sh //启动
Using CATALINA_BASE: /usr/local/apache-tomcat-7.0.105
Using CATALINA_HOME: /usr/local/apache-tomcat-7.0.105
Using CATALINA_TMPDIR: /usr/local/apache-tomcat-7.0.105/temp
Using JRE_HOME: /usr/local/java/jdk1.8.0_251/jre
Using CLASSPATH: /usr/local/apache-tomcat-7.0.105/bin/bootstrap.jar:/usr/local/apache-tomcat-7.0.105/bin/tomcat-juli.jar
Tomcat started.
[root@iZbp14eey5dlgt99xx7qptZ /]# ps -ef|grep tomcat
root 2207 1 46 16:21 pts/0 00:00:02 /usr/local/java/jdk1.8.0_251/jre/bin/java -Djava.util.logging.config.file=/usr/local/apache-tomcat-7.0.105/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /usr/local/apache-tomcat-7.0.105/bin/bootstrap.jar:/usr/local/apache-tomcat-7.0.105/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/apache-tomcat-7.0.105 -Dcatalina.home=/usr/local/apache-tomcat-7.0.105 -Djava.io.tmpdir=/usr/local/apache-tomcat-7.0.105/temp org.apache.catalina.startup.Bootstrap start
root 2267 1199 0 16:21 pts/0 00:00:00 grep --color=auto tomcat
[root@iZbp14eey5dlgt99xx7qptZ /]# shutdown.sh //关闭
Using CATALINA_BASE: /usr/local/apache-tomcat-7.0.105
Using CATALINA_HOME: /usr/local/apache-tomcat-7.0.105
Using CATALINA_TMPDIR: /usr/local/apache-tomcat-7.0.105/temp
Using JRE_HOME: /usr/local/java/jdk1.8.0_251/jre
Using CLASSPATH: /usr/local/apache-tomcat-7.0.105/bin/bootstrap.jar:/usr/local/apache-tomcat-7.0.105/bin/tomcat-juli.jar
[root@iZbp14eey5dlgt99xx7qptZ /]# ps -ef|grep tomcat
root 2358 1199 0 16:22 pts/0 00:00:00 grep --color=auto tomcat
目录
bin
运行功能
conf
对tomcat修改的配置文件
lib
tomcat的jar包
logs
tomcat启动和运行时的日志
temp
临时存放文件,里面的内容可以删,目录不能删
webapps
web应用
ROOT:当url未指定具体目录时,则默认访问此目录下的站点
work
放jsp编译成class的目录
配置文件
tomcat 部署方式
静态部署(需要重启tomcat)
1.直接往webapps里放站点
2.修改host节点,添加几点
3.类似第2种,在conf/Catalina/localhost 新建一个xml,名称与path名称相同,如叫m.xml pc.xml,里面配置
热部署(不需要重启tomcat)
需要在tomcat的管理界面下部署
1.在tomcat-user.xml 配置用户名 密码,开启gui/script权限 并配置用户名 密码
2.在那个默认猫的界面,点manage
tomcat原理
1.客户端向服务器发送请求
2.连接器Connector,默认8080端口,连接器一般有http、ajp
3.连接器将请求发给引擎Engine
4.将访问的资源解析到虚拟主机host
5.匹配虚拟主机
6.通过maaping table找到相应的servlet
tomcat监控
status
通过默认地址(带猫的界面)打开状态管理界面
probe 探针
需要提前安装
tomcat 优化
###jvm 优化
//查看进程 可以看到jvm的配置
[shtermuser@172-17-12-111 ~]$ ps -ef|grep tomcat
linux 修改catalinna.sh文件
windows 修改catalina.bat文件
jvm设置,就是设置某个依赖java运行环境的进程的jvm参数
参数设置
export JAVA_OPTS="-server -Xms4096M -Xmx4096M -Xmn1536M -Xss512k -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:+DisableExplicitGC -XX:MaxTenuringThreshold=15 -XX:+UseConcMarkSweepGC
-XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -Djava.awt.headless=true "
-server:启用jdk的server版本。
-Xms:虚拟机初始化时的最小堆内存。
-Xmx:虚拟机可使用的最大堆内存。 #-Xms与-Xmx设成一样的值,避免JVM因为频繁的GC导致性能大起大落
-Xmn:年轻带堆内存,sun官方推荐为整个堆的3/8
-Xss: 为jvm启动的每个线程分配的内存大小
-XX:+AggressiveOpts 加快编译
-XX:+UseBiasedLocking 锁机制的性能改善
-XX:+DisableExplicitGC 关闭System.gc()–避免程序误写 影响性能
-XX:MaxTenuringThreshold 垃圾最大年龄
-XX:+UseConcMarkSweepGC 使用CMS内存收集
-XX:+UseParNewGC 设置年轻代为并行收集
-XX:+CMSParallelRemarkEnabled 降低标记停顿
-XX:LargePageSizeInBytes 内存页的大小不可设置过大, 会影响Perm的大小
-XX:+UseFastAccessorMethods 原始类型的快速优化
-XX:+UseCMSInitiatingOccupancyOnly 使用手动定义初始化定义开始CMS收集
-XX:PermSize:设置非堆内存初始值,默认是物理内存的1/64。
-XX:MaxPermSize:Perm(俗称方法区)占整个堆内存的最大值,也称内存最大永久保留区域。
-XX:MaxNewSize:新生代占整个堆内存的最大值。
常见的错误及对应调整参数方案
错误提示:java.lang.OutOfMemoryError:Java heap space
Tomcat默认可以使用的内存为128MB,在较大型的应用项目中,这点内存是不够的,有可能导致系统无法运行。常见的问题是报Tomcat内存溢出错误,Outof Memory(系统内存不足)的异常,从而导致客户端显示500错误,一般调整Tomcat的-Xms和-Xmx即可解决问题,通常将-Xms和-Xmx设置成一样,堆的最大值设置为物理可用内存的最大值的80%。
set JAVA_OPTS=-Xms512m-Xmx512m
错误提示:java.lang.OutOfMemoryError: PermGenspace
PermGenspace的全称是Permanent Generationspace,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGenspace中,它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGenspace进行清理,所以如果你的应用中有很CLASS的话,就很可能出现PermGen space错误,这种错误常见在web服务器对JSP进行precompile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。解决方法:
setJAVA_OPTS=-XX:PermSize=128M
在使用-Xms和-Xmx调整tomcat的堆大小时,还需要考虑垃圾回收机制。如果系统花费很多的时间收集垃圾,请减小堆大小。一次完全的垃圾收集应该不超过3-5 秒。如果垃圾收集成为瓶颈,那么需要指定代的大小,检查垃圾收集的详细输出,研究垃圾收集参数对性能的影响。一般说来,你应该使用物理内存的 80% 作为堆大小。当增加处理器时,记得增加内存,因为分配可以并行进行,而垃圾收集不是并行的。
连接数优化
conf/server.xml配置文件中进行修改
• maxThreads:tomcat可用于请求处理的最大线程数,默认是500
• minSpareThreads:tomcat初始线程数,即最小空闲线程数250
• maxSpareThreads:tomcat最大空闲线程数,超过的会被关闭 500
• acceptCount:当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理.500
线程池
<Executor name=“tomcatThreadPool” namePrefix="req-exec-"maxThreads=“1000” minSpareThreads="50"maxIdleTime=“60000”/>
<Connector port=“8080” protocol="HTTP/1.1"executor=“tomcatThreadPool”/>
其中:
• namePrefix:线程池中线程的命名前缀
• maxThreads:线程池的最大线程数
• minSpareThreads:线程池的最小空闲线程数
• maxIdleTime:超过最小空闲线程数时,多的线程会等待这个时间长度,然后关闭
• threadPriority:线程优先级
注:当tomcat并发用户量大的时候,单个jvm进程确实可能打开过多的文件句柄,这时会报java.net.SocketException:Too many open files错误。可使用下面步骤检查:
• ps -ef |grep tomcat 查看tomcat的进程ID,记录ID号,假设进程ID为10001
• lsof -p 10001|wc -l 查看当前进程id为10001的 文件操作数
• 使用命令:ulimit -a 查看每个用户允许打开的最大文件数
运行模式
BIO:一个线程处理一个请求。缺点:并发量高时,线程数较多,浪费资源。Tomcat7或以下在Linux系统中默认使用这种方式。
NIO:利用Java的异步IO处理,可以通过少量的线程处理大量的请求。Tomcat8在Linux系统中默认使用这种方式。Tomcat7必须修改Connector配置来启动(conf/server.xml配置文件):
APR:从操作系统层面解决io阻塞问题。Linux如果安装了apr和native,Tomcat直接启动就支持apr。
日志文件
logging.properties 设置日志级别,默认FINE
1.catalina.日期
记录tomcat服务器启动、停止等相关的线程信息
2.catalina.out
与1的内容相似,记录后台线程或守护进程的相关
3.host-manage.日期
记录管理服务相关的信息,一般为空
4.localhost.日期
记录主要相关线程运行时调用的方法或属性,以及java线程号
5.localhsot_access_log.日期
记录客户端访问服务器的相关信息
访问的ip/用户名/邮箱/日期时间/http请求方式/请求url地址/协议类型/http返回状态码/发送的字节数
6.manager.日志
记录管理相关日志,与host-manage类似
开机自启动
1.修改/etc/rc.d/rc.local
2.添加路径
export JAVA_HOME=/usr/local/java/jdk1.8.0_251
/usr/local/apache-tomcat-7.0.105/bin/startup.sh start
3.添加执行权限 chmod +x /etc/rc.d/rc.local