Java Web,Struts2过滤器,总是检查文件不存在,导致缓存泄漏

Java Web,Struts2过滤器,总是检查文件不存在,导致缓存泄漏,java,servlets,memory-leaks,struts2,filter,Java,Servlets,Memory Leaks,Struts2,Filter,我正在Tomcat7上运行struts2 web项目 然后,我创建了一个空servlet 我通过python Requests做了一个测试不管怎样,对于循环post,您可以使用ab、seige或其他客户机进行测试: for i in range (0,20000000): r = requests.post("http://127.0.0.1:8080/aaa/emptyservlet", files={'file': open('./req.txt')}, data={'a':'aaaa'

我正在Tomcat7上运行struts2 web项目

然后,我创建了一个空servlet 我通过python Requests做了一个测试不管怎样,对于循环post,您可以使用ab、seige或其他客户机进行测试:

for i in range (0,20000000):
  r = requests.post("http://127.0.0.1:8080/aaa/emptyservlet", files={'file': open('./req.txt')}, data={'a':'aaaa'});
  ....
在服务器端,Tomcat收到一个多部分/表单数据的http post请求,而我的emptyservlet什么也没做

这只是一个简单的测试,一切都正常运行。 但我发现,如果在url中添加struts2过滤器,会出现一个奇怪的问题:

(add a StrutsPrepareAndExecuteFilter, and set it to /*)

  <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
    ....
  <filter-mapping>
这将导致linux dentry缓存泄漏:

$  cat /proc/slabinfo | grep dentry      
dentry            3860290 3860300    192   20    1 : tunables  120   60    8 : slabdata 193015 193015    480
$  cat /proc/slabinfo | grep dentry
dentry            3862046 3862060    192   20    1 : tunables  120   60    8 : slabdata 193103 193103    480
$  cat /proc/slabinfo | grep dentry
dentry            3863361 3863380    192   20    1 : tunables  120   60    8 : slabdata 193169 193169    480
$  cat /proc/slabinfo | grep dentry
dentry            4090300 4090300    192   20    1 : tunables  120   60    8 : slabdata 204515 204515    120

....
你会看到齿状突起一直在增加

如果删除web.xml中的Struts2过滤器,这种现象就会消失


那么,这是一个bug吗?或者如何避免缓存泄漏?..

当使用Struts2时,应尽可能使用操作而不是servlet

操作是线程安全的,而servlet不是; 操作在操作执行前后被随时可用的拦截器拦截,而对于Servlet,您需要从头开始编写自己的Servlet过滤器。 顺便说一下,如果出于某种原因需要使用Servlet而不是操作,则需要将其排除在StrutsPrepareAndExecuteFilter拦截之外

您可以在struts配置struts.xml中这样做,如下所示,用于单个servlet:

或多种模式:


如前所述。

当您关闭JVM时,这些文件是否保留在那里?@Yogi:不,没有生成文件,目录始终为空。所有这些文件都不存在,我认为它的struts2框架只是创建tmp文件进行处理。如果在应用程序部署时,无论是否在/data/project/tempdir/中为空,文件都没有被刷新,并且文件不断堆积,那么您可能会遇到其他问题,这应该是正常的。@Yogi:对不起,我的英语很差,所以我不明白您的意思:…@lonelycoder您尝试过提供的答案了吗?您是否已在操作配置中排除servlet?我尝试了excludePatternvalue=/aaa/emptyservlet,但缓存泄漏仍然存在…尝试仅使用/emptyservlet,aaa似乎是您的上下文我尝试了仅使用/emptyservlet值=/emptyservlet,仍然存在缓存泄漏:
$  cat /proc/slabinfo | grep dentry      
dentry            3860290 3860300    192   20    1 : tunables  120   60    8 : slabdata 193015 193015    480
$  cat /proc/slabinfo | grep dentry
dentry            3862046 3862060    192   20    1 : tunables  120   60    8 : slabdata 193103 193103    480
$  cat /proc/slabinfo | grep dentry
dentry            3863361 3863380    192   20    1 : tunables  120   60    8 : slabdata 193169 193169    480
$  cat /proc/slabinfo | grep dentry
dentry            4090300 4090300    192   20    1 : tunables  120   60    8 : slabdata 204515 204515    120

....