想对Tomcat性能进行优化该如何操作? 下载本文

内容发布更新时间 : 2024/12/25 10:25:37星期一 下面是文章的全部内容请认真阅读。

收到一个小伙伴的吐槽:可儿,美团的面试太变态了,我只是在工作中用过Tomcat,然后简历上提了下,就被抓着一个劲的问,一些基础的问题,我还可以勉强答出来,但是问到“你平时是如何进行Tomcat性能优化的”,我就懵逼了。

说实话,这个可儿也不知道,对于Tomcat,我也只会用。

一直没有深入接触过Tomcat相关的知识,为了拓展一下技术深度,找到了美团的我狼哥,狼哥给我推荐了李老师的专栏,如获至宝。 这位大佬,我介绍一下:

李号双,eBay 技术主管,2009 年毕业后加入惠普,先后负责分布式企业级应用的开发与架构设计,以及容器化上云。

2018 年加入 eBay, 参与 eBay 付款系统 2.0 的设计与研发,负责可靠性和高可用部分,系统采用定制版的 Tomcat 运行大规模微服务实例,并且通读过 Tomcat 源码,具有丰富的线上问题定位和调优经验。 以下是他的分享:

很多「过来人」都会告诫新人,编程没有捷径可走,不花费几年时间经过大量的实践和刻意练习怎么能领悟编程的精髓呢?

我曾经也是一名“刻苦”的新人,直到后面才体会到,其实在 Java 的学习上,同样也逃不开”二八原则“,即掌握 20% 的知识,就能解决 80% 的问题。 这一点也是我工作很久之后才悟出来的,这种思维方式让我在之后的 Java 学习路上受益很大。

我先来讲讲自己的经历。

十年前,我在实习做嵌入式系统开发,开发语言是 C 和 C++。出于我个人兴趣爱好,当时我想转 Java,学了一段时间后,发 现 Java 上手还挺快,API 比较齐全,也不需要自己来管理内存,感觉比 C 语言高级。

毕业后我顺利地找到了一个 Java 开发的工作,入职后我的工作主要是实现一些小模块,很多时候通过代码的复制粘贴,再稍微改改就能完成功能,这样的状态大概持续了一年。

可儿认为:工作前三年对于咱们技术人成长非常关键,CRUD 不应该是常态。

在这个过程中,我对 Java 语法更加熟悉了,也“背”过一些设计模式,用过一些 Web 框架,但是很少有机会将一些 Java 的高级特性运用到实际项目中,因此对它们的理解也是模糊的。

那时候如果让我独立设计一个系统,我会感到非常茫然,不知道从哪里下手;对于 Web 框架,我也只是知道这样用是可以的,但却不知道它背后的原理是什么。

而且,在我脑子里没有一张 Java Web 开发的全景图,举个例子,我不知道浏览器的请求是怎么跟 Spring 中的代码联系起来的。

可儿认为:80% 新人都会有的困境,可惜只有 20% 找到了方法,大部分人在工作早期没有高手带路,走了很多弯路。

后来我分析发现,我的知识体系在广度和深度上都有问题。然而 Java 知识体系很庞大,我到底该专注于哪一方面?

接着,我注意到了像 Tomcat 和 Jetty 这样的 Web 容器,觉得它们很神奇,只需要把 Web 应用打成 WAR 包放到它的目录下,启动起来就能通过浏览器来访问了。

那 Web 容器究竟是如何工作的?带着这份好奇心,我决定选择 Tomcat 来深入研究。

学习了Tomcat的原理之后,我发现Servlet技术是Web开发的原点,几乎所有的Java Web框架(比如Spring)都是基于Servlet的封装,从Servlet规范

的角度来看,Spring应用其实就是一个Servlet,而Tomcat和Jetty这样的Web容器,负责加载和运行Servlet。

你可以通过下面这张图来理解 Tomcat/Jetty 在 Web 开发中的位置:

随着学习的深入,我还发现 Tomcat 和 Jetty 中用到不少 Java 高级技术,比如 Java 多线程并发编程、Socket 网络编程以及反射等等。

之前我仅仅只是了解这些技术,为了面试也背过一些题,但是总感觉“知道”和“会用”之间存在一道鸿沟。

通过对 Tomcat 和 Jetty 源码的学习,我学会了在什么样的场景下去用这些技术,这一点至关重要。

在理解了 Web 容器以及 JVM 的工作原理后,我开始解决线上的疑难杂症,并且尝试对线上的 Tomcat 进行调优。性能的提升也是实实在在的成果,我也因此得到了同事们的认可。

总之,在这个过程中,我逐渐建立起了自己的知识体系,也开始独立设计一个系统,独立解决技术难题,也就是说我渐渐具备了独当一面的能力,而这正是高级程序员或者架构师的特质。

概括一下,独当一面的能力,离不开技术的广度和深度。

后来我才发现,这种能力其实是我在深入学习 Tomcat 的过程中才逐渐拥有的,这就是回归到我开头说的观点:掌握 20% 的知识,就能解决 80% 的问题。

人的精力是有限的,广度和深度该如何权衡呢?我建议找准一个点先突破深度,而 Tomcat 和 Jetty 就是非常好的选择。