JVM之tomcat
JAVA包含4个独立且相关的技术:[*] JAVA程序设计语言(由sun公司的一个团队开发)
[*] JAVA API(一类是由sun公司定义的规范( 只维持了很少一段时间),一类是由JAVA的规范开放组织定义的规范(受欢迎的))
[*]
JVM的种类:
[*] Hotspot JVM(sun公司的)
[*] JRE JVM+java+SE API(java 运行时环境,实现java的运行)
[*] JDK java+API+JVM,还额外提供一些调试和监控工具等,是用于实现java开发的最小环境(java开发组件,实现java的开发编译及运行)
[*] Open JDK
[*] 开发+运行的开源实现
java应用领域的不同,java分为3类:
[*] JAVA SE(Standard Edition,java的标准版,为中小型应用提供的类库)
[*] JAVA EE(EnterpriseEdition,java的企业版)
[*] JAVA ME(Mobile Edition,企业中用到的很少,一般用android或object C)
java开发的程序要在每一个用户的计算机上都能运行,由于早前对动态网站的迫切需要, 在这种情况下,java在它的类库 当中引入了一个applet(小程序),它能够让html的程序员在他们开发的页面中直接提供一个编译好的applet小程序,这时,只要客户端只要在浏览器中安装了jre插件的话,就能实现让applet在客户端执行,根据客户端本地的运行环境,能将执行结果通过结果显示给用户,由此,动态网页成为了现实。这称为客户端动态网页
缺点:
需要客户端配置jre,下载applet插件。对客户端造成了麻烦,需要打开权限允许远程客户端执行一些程序 ,提供jre环境,允许远程用户执行,假如一个恶意的用户开发了一个恶意程序 ,在服务器上的jvm中执行。会对jvm和系统造成危害,后来被cgi技术取代。
CGI协议(通用网关接口):
能够让用户访问某一种特定资源的时候,触发web服务器,让web服务器根据这种协议调用额外的进程来执行这段程序,然后将执行结果格式化成html文档在返回给web服务器,由web服务器在返回给客户端,这就叫CGI。
java的cgi(以java技术实现了cgi。javaAPI的另一种特殊规范):
servlet:
能够让用户接受http 请求,能够理解http协议,并且能够将 程序的执行结果以http格式封装起来 通过前端响应给客户端,增加了对http协议的处理能力,这样一来,就能理解http协议和html协议了。
有一个问题是,如果修改了网页源代码,那么需要重新编译。后来用mvc框架对程序分层。并且为了将java代码嵌套在html代码中,在servlet基础上引入了一个新的特殊类jsp。
JSP(Java Server Page,能够让程序猿以嵌入式代码的方式在html中来潜入java代码,从而实现基于java技术的动态网站开发):
是servlet上的一个特殊类,主要是为了实现网页开发的。虽然可以嵌入了,但实现MVC还需要一步,SSH(structs spring hebernate )模版,开发JSP的一个非常重要的框架。
JSP要执行必须要先通过jasper转换成servlet,最后通过JVM执行,JSP运行性能要比php好得多,而且java比php成熟很多。一般来讲,大型应用,或者对性能有要求的应用都会使用jsp。比如淘宝,早期是php,后来都移植成了JSP。
jsp、servlet和jvm的关系:
jsp——>servlet——>jvm
jasper负责监控jsp内容的改变,并转换成servlet
JDK可以将servlet转换成.class
Servlet Container(包含了JDK又包含JDK本身所不具备的,又能让servlet本身工作起来的额外的组件)容器:
负责接收CGI传递过来的请求,负责监控本地的java程序是否发生了修改。
接受前端web服务器的交互,前端有一个web应用程序(负责接收用户的请求),一旦发现用户请求的是一个CGI的内容,开始执行servlet进程,在本地的JVM上执行。
Web Container(包含了web服务器、jasper,servlet相关技术的框架叫做web容器)
java虚拟机不像FastCGI一样为一个请求启动一个CGI进程,因为java启动一个CGI进程要比FastCGI的代价大很多,所以,java支持多线程,为每一个请求在JVM中启动一个线程来处理。
JVM的实现方式:
1.一次性的解释器(解释字节码并执行,bytecode,解释的过程是将与平台无关的代码解释成与平台相关的代码)
优点:节省内存,不对解释过的bytecode缓存。节省内存
缺点:每一次执行都要重新解释一遍,速度慢
2.即时编译器(将每一个运行的class文件解释成二进制文件,并缓存在内存中 )
优点:运行速度快,只在第一次运行时解释。
缺点:要牺牲更多的内存来缓存解释过的二进制。
3.自适应编译器(内部有一个监控器,利用28原则来加速代码的执行。缓存20%左右的代码,提高80%左右的速度)
JDK的安装:
[*] 安装jdk
# tar -zxf jdk-8u60-linux-x64.tar.gz
# mkdir -p /usr/local/java/
# ln -s /usr/local/src/jdk1.8.0_60 /usr/local/java/jdk
2.设置环境变量
# echo -e 'export JAVA_HOME=/usr/local/java/jdk/\nexport PATH=$PATH:$JAVA_HOME/bin' >>/etc/profile.d/java.sh
# source /etc/profile.d/java.sh
3.验证
# java -version
java version "1.8.0_60"
Java(TM) SE Runtime Environment (build 1.8.0_60-b27)
Java HotSpot(TM) 64-Bit Server VM (build 25.60-b23, mixed mode) 如果出现上面的提示,表示jdk已经安装完成
jdk常用命令:
sunJDK监控和故障处理工具:
jps(JVM Process Status Tool),显示系统内所有的Hotspot虚拟机进程的列表信息。
jstat(JVM StatisticsMonitoring Tool),收集并显示Hotspot虚拟机个方面的运行数据。
jinfo,显示正在运行的某Hotspot虚拟机配置信息
jmap,生成某Hotspot虚拟机的内存转储快照。
可视化工具:
jconsole:java的监控与管理控制台
jvisualm:可视化监控工具,可查看配置。
web container(web容器):
实现了java ee所有api的一个应用程序,只要用户在开发的时候基于java ee的api所开发的应用程序就能在 web容器中部署并运行起来,这么一个应用程序就称为web容器。
常见的web容器:
1.websphere
2.weblogic
3.oc4j
4.jboss
5.jonas
6.geronimo
7.glassfish
8.tomcat
9.risen
tomcat容器的组成:
1.tomcat实例(server),可以直接响应http请求,每一个server称为是一个tomcat实例,启动一个tomcat就是启动一个server
2.tomcat的服务(service),将多个connector关联至一个引擎上去的,一个service内部只能有一个引擎
3.tomcat的引擎(engine),就是一个servlet container的实现。
4.tomcat的主机(一个引擎内主机可以有多个,主机内部还可以有contaxt),用来在引擎内部实现虚拟主机的
5.tomcat的上下文(context),主要功能就是用于定义类似于apache的路径别名。
connector的类型:
[*] http
[*] https
[*] proxy
[*] ajp
tomcat的集群部署方案:
tomcat本身自带web服务器,因为tomcat又要负责http的请求,又需要处理jsp请求,压力很大。在这种情况下,可以使用nginx或apache处理http请求。将动态请求转发给tomcat处理。这样大大的减轻了tomcat的压力。
1.nginx反向代理+tomcat应用服务器
将后端的tomcat服务器组通过nginx的upstream模块组合起来,通过负载算法将http协议的方式发往后方的tomcat应用服务器,效率低于apache的apj(二进制的)协议。
2.apache反向代理+tomcat应用服务器
通过apache的mod_proxy模块的专用apj(apache jserv protocol)协议的方式发往后端的tomcat应用服务器。
tomcat的安装:
# tar -zxf apache-tomcat-8.0.27.tar.gz -C /usr/local/src/
# ln -s /usr/local/src/apache-tomcat-8.0.27 /usr/local/java/tomcat 配置catalina环境变量:
# echo -e 'export CATALINA_HOME=/usr/local/java/tomcat\nexport PATH=$PATH:$CATALINA_HOME/bin' >>/etc/profile.d/tomcat.sh
# source /etc/profile.d/tomcat.sh 启动tomcat:
# catalina.sh start
编辑tomcat的sysv的启动脚本:
vim /etc/init.d/tomcat
#!/bin/bash
# chkconfig 2345 96 14
# description:The Apache Tomcat servlet/JSP container.
CATALINA_PID=/usr/local/java/tomcat/logs/tomcat.pid
JAVA_HOME=/usr/local/java/jdk
CATALINA_HOME=/usr/local/java/tomcat
export JAVA_HOME CATALINA_HOME
function restart()
{
exec $CATALINA_HOME/bin/catalina.sh stop
sleep 2
exec $CATALINA_HOME/bin/catalina.sh start
}
case $1 in
restart)
restart
;;
start)
exec $CATALINA_HOME/bin/catalina.sh $*
;;
stop)
exec $CATALINA_HOME/bin/catalina.sh $*
;;
*)
echo "Usage: $0 |stop|start|restart"
;;
esacchmod +x /etc/init.d/tomcat
chkconfig --add tomcat tomcat的配置文件:
1.server.xml:核心配置文件,遵循tomcat的组成部分配置
2.tomcat-user.xml:定义用户认证的账号密码,基于realm用户认证的配置文件。
3.web.xml:默认的应用程序部署(将一个web应用程序所依赖到的类装载进JVM)描述符。
4.context.xml:为上下文提供的配置
5.catalina.properties:定义应用程序自身属性的配置文件,比如:使用的内存大小,字符串缓冲池大小等等。
6.logging.properties:定义日志相关的属性,比如:日志级别,日志路径等
7.catalina.policy:定义tomcat自身的安全策略的,比如:哪些资源能被用户访问,哪些资源不能被用户访问,哪些可以被装载,哪些不能被装载等。
页:
[1]