进行Servlet分析的最佳方法是什么?
特别是我正在寻找一种能够显示servlet中方法调用执行时间的解决方案。
我在Tomcat环境中运行Servlet。
我尝试过VisualVM,但它只允许我从Tomcat线程而不是Servlet本身看到方法调用。
答案 0 :(得分:3)
手动方法可能是为有问题的servlet创建一个过滤器,然后您可以测量完成所有执行并将其存储在某处所需的时间。 这很好,因为分析调用的开销与在过滤器中编写的代码一样多,我还发现找到完全加载需要更长时间的页面和servlet非常有用。
这是过滤器的工作原理
为此,请创建一个实现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中的map中,然后让另一个servlet显示这些统计信息。这样你甚至不需要访问磁盘。
答案 1 :(得分:2)
我使用JProfiler进行性能分析,他们支持许多不同的服务器,并提供非常好的控制和良好的报告。然而,这是一个商业应用程序,但您可以获得评估版本。你也可以看一下open source profilers,虽然我没有使用过任何这些,也不能说它们有多好或多坏。
修改强> 我假设您了解分析的工作原理,分析器将执行一些检测并将代理附加到JVM,这一切都会影响性能。所以永远不要在生产环境中使用它。
答案 2 :(得分:1)
答案 3 :(得分:1)
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任务控制查看该文件。