Servlet 分析
Posted
技术标签:
【中文标题】Servlet 分析【英文标题】:Servlet Profiling 【发布时间】:2010-03-12 04:49:18 【问题描述】:进行 的最佳方式是什么?
特别是我正在寻找一种可以显示 servlet 中方法调用的执行时间的解决方案。
我在 Tomcat 环境中运行 Servlet。
我尝试过 VisualVM,但它只能让我看到来自 Tomcat 线程的方法调用,而不是 Servlet 本身。
【问题讨论】:
LambdaProbe 很容易集成到 Tomcat 中。它显示了 servlet 执行的数量、最小/最大时间以及会话属性和内存大小。但它不会执行您想要查看的单个方法调用。 JProbe 和 JProfiler 都很有用 - 都是商业产品 【参考方案1】:我使用JProfiler 进行分析,它们支持许多不同的服务器并提供非常好的控制和良好的报告。但是它是一个商业应用程序,尽管您可以获得评估版本。你也可以看看open source profilers,虽然我没用过,也说不出好坏。
编辑 我假设您了解分析的工作原理,分析器将执行一些检测并将代理附加到 JVM,所有这些都会影响性能。所以永远不要在生产环境中使用它。
【讨论】:
【参考方案2】:对此的手动方法可能是为相关 servlet 创建一个过滤器,然后您可以测量完成所有执行所需的时间并将它们存储在某个地方。 这很好,因为分析调用的开销与您在过滤器中编写的代码一样多,我还发现查找需要更长时间才能完全加载的页面和 servlet 非常有用。
这就是过滤器的工作原理
网址被调用 过滤器进入并存储调用的url和当前时间(startTime) 过滤器调用目标 servlet Servlet 执行(servlet、页面或 jsp) 控制返回过滤器执行时间为:currentTime - startTime 记录或存储获得的数据以供将来比较(即存储到 csv 文件) 过滤器结束为此,请创建一个实现 javax.servlet.Filter 接口的类。
public class ProfilingFilter implements Filter
public void init(FilterConfig fc)
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
long startTime = System.currentTimeInMillis();
String servletName = ((HttpServletRequest) req)..getPathInfo();
chain.doFilter(req, resp);
long executionTime = System.currentTimeInMillis()-startTime;
// Implement the following to store or handle the data.
logData(servletName, executionTime);
现在将它添加到您的 web.xml
<filter>
<filter-name>profilingFilter</filter-name>
<filter-class>com.awesome.ProfilingFilter</filter-class>
</filter>
最后是映射:
<filter-mapping>
<filter-name>profilingFilter</filter-name>
<url-pattern>*</url-pattern>
</filter-mapping>
请注意,这将过滤所有内容,因此您可以配置文件、html、jsp、servlet、图像等等。
我们发现这对于找出应用程序中的确切内容需要太多时间来响应或非常繁重非常有用。
您甚至可以在生产环境中启用此功能一两天以获取真实数据,对性能的影响与保存分析数据所花费的代码一样大。
一些想法:将您的统计信息存储在 servlet-context 内的地图中,然后让另一个 servlet 显示这些统计信息。这样你甚至不需要访问磁盘。
【讨论】:
【参考方案3】:你为什么不使用JConsole - 它暴露了MBeans。您的容器应用程序可能会公开一些与您的 servlet 相关的有用字段 - 如果没有,您可以创建自己的 MBean。
【讨论】:
【参考方案4】:2015 年。 由于 JDK 7u60(如果我没记错的话)jvm 有一个内置工具来分析 java 应用程序。据说它非常轻量级,占 CPU 消耗的 1%。 它被称为 Java Flight Recorder。 要启用它,您需要 7u60 的 jdk 版本并使用以下标志启动您的应用程序。
-XX:+UnlockCommercialFeatures -XX:+FlightRecorder -XX:StartFlightRecording=duration=60s,filename=myrecording.jfr
这里duration=60s
设置分析的持续时间(根据需要设置),filename=myrecording.jfr
设置将保存分析信息的文件。
然后就可以使用java任务控制查看文件了。
Video here
Docs here
【讨论】:
它是免费工具吗?以上是关于Servlet 分析的主要内容,如果未能解决你的问题,请参考以下文章
学习笔记——Servlet底层源码分析;Servlet接口;ServletConfig接口;