衡量性能的四大指标:响应时间,吞吐量,CPU负载,内存使用情况,这几个指标并不是单独的,而是一起的,他们是一个四边关系,各个指标都是建立在其他的指标基础上的。他们相互影响,相互关联。
理想是丰满的,现实是骨感的,优化中讲究积少成多,每个方面一点点的优化,多起来的话对全局就有影响了。性能优化其实也是这样的一个主题。
1.Tomcat性能优化中使用的工具
jmeter 这个工具是纯 java 写的,它也是一个分布式的工具,可以做单机测试,也可以做分布式的多机的压力测试。具体怎么做分布式压力测试可以百度到。
2.Tomcat中server.xml优化
-
NIO
小明在家附近的一个很大的理发店办了张会员卡,那个店子生意太好,每次去剪头发都需要排队,这个剪头发的过程本身就是一个长时间的过程,是一个长连接。如果是采用BIO的方式,一个理发师只能同时服务一个人
如果采用NIO的话,可以把过程进行拆解,把剪发分为洗发、剪发、吹法。现在理发店都是采用雇佣很多年轻的小伙子,不管人多少,洗发这个过程可以不阻塞,洗完可能需要等理发师剪发,理发师剪完发后再转给之前洗发的小伙子给你吹干。
前面小明这个剪头发的流程就是一个典型的NIO。最大压榨了理发师,把理发师的时间片段都利用了起来。这个就是Tomcat 8.5已经9的版本后把BIO给废掉了的原因。
-
线程池
线程池的好处在于统一管理,使用线程池的话如果发现线程空闲时间达到比如(60秒的时间),会自动回收。如果不使用线程池的话就把线程池丢给的gc去回收。(jvm的回收机制),这个就很难控制了,所以使用线程池最大的好处是保证系统的稳定性,很多时候我们做项目,稳定性是排在第一位的。
3.Tomcat中web.xml优化
JSP 其实是jsp -> java -> class的一个过程。Tomcat在运行过程中会把你访问的这些jsp做这些操作,其实我们可以预先编译下,节约性能。
4.SpringBoot中Tomcat的优化
SpringBoot中用了 TomcatContextCustomizer 和 TomcatConnectorCustomizer 来实现Tomcat,可以看看这个方面的源码