tomcat官网:软件包下载:http://tomcat.apache.org/download-80.cgi
tomcat是一个免费,开源的web应用服务器,也可处理静态页面,但是 效果不是很理想。
Tomcat一般是作为一个Servlet和JSP容器,单独运行在后端,需要与nginx或apache结合使用。
主要是用来处理java程序。
web容器:
商业实现:WebSphere, WebLogic, OC4J, Glassfish, Geronimo, JBoss, JOnAS.
开源实现: Tomcat,jetty,resion
tomcat工作原理:
有三种工作模式:
Bio : 默认工作模式,阻塞式I/O操作,性能较低。
Nio : 非阻塞式I/O操作,并发处理性能好。
Apr(apache可移植运行库) : 首选工作模式,主要是为上层的应用程序提供一个可以跨越的多操作系统平台使用的底层支持接口库。
tomcat利用基于Apr库tomcat-native来实现操作系统级别,提供一种优化技术和非阻塞式I/O操作,提高并发处理能力,不过,需要安装apr和tomcat-native库。
工作模式原理涉及到了网络I/O模型:
大概有以下几种:
阻塞I/O模型,非阻塞I/O模型,I/O复用模型,异步I/O模型,因理论较多,文字比较难理解,在此,不做详细说明。
java性能问题主要来自JVM虚拟机, 需要了解一下以下概念:
(1) JVM内存分为年轻代,老年代,永久代。
年轻代分为Eden和Survivor区,Survivor区由FromSpace和ToSpace组成。
(2) 堆内存=年轻代 + 老年代, 非堆内存 = 永久代。
堆内存作用: 存放对象,垃圾收集器,就是收集这些对象,然后根据GC算法回收。
非堆内存作用: JVM本身使用,存放一些类,方法,常量,属性等。
年轻代: 对象放到Eden区,Eden区满时,经过GC算法,存活的对象放到FromSpace中。然后被复制到ToSpace区,最终存活的对象会被复制到老年代。
老年代: 老年代空间不足时,JVM会对老年代进行垃圾回收(full GC ),如果GC后,无法存放年轻代复制过来的对象,就会出现内存不足的现象。
永久代 : 也称为方法区,存放静态类型数据,比如类,方法,属性等。
垃圾回收算法(GC) :
标记--清除 : 先标记回收的对象,再回收被标记的对象。内存碎片较多,只能再次GC。
复制 : 内存容量分为两块,每次只使用一块,每次都只是对半个内存区回收,简单高效。
缺点是: 需要两倍的内存空间。
标记---整理 :先标记可回收的对象,再将存活的对象都向一端移动,然后清理掉边界外的内存。避免了前两者出现的问题。
年轻代,老年代会采用不同的GC算法。
垃圾收集器:
(1) 串行收集器: 单线程,收集时,需暂停应用的工作进程。
(2) 并行收集器: 多条垃圾收集线程并行工作,在多核CPU下效率更高,应用线程仍然处于
等待状态。
(3) CMS收集器: 缩短暂停应用时间, 基于标记--清除算法实现,分为四步:
初始标记和并发标记 : 需要暂停应用线程。标记关联对象,标记可回收对象。
重新标记 : 修正导致标记发生变动的对象的标记记录。
并发清除 与并发标记过程: 收集器线程和用户线程一起工作,CMS收集器内存回收和用户是并发执行的,减少暂停时间。
(4) G1收集器 : 划分独立区域,预测暂停时间,工作过程分为4步:
初始标记:标记关联对象。
并发标记: 标记存活对象,可与应用线程并发执行。
最终标记 : 与重新标记一样。
筛选回收 : 对各个回收价值和成本进行排序,根据用户所期望的GC暂停时间来执行回收。