在jboss/server/web/tmp/vfs-nested.tmp目录下有大量的JAR文件。

16
有时候我们在 jboss/server/web/tmp/vfs-nested.tmp 目录下会有大量的JAR文件。
例如,今天这个目录中包含了超过350,000个JAR文件。
但是在其他主机上,这个目录中只有2个JAR文件。
问题的根本原因是什么?
我们使用的是JBoss 5.1版本。 更新:
我在JBoss 5.1.0.GA版本的发布说明中找到了以下信息:
JBoss VFS提供了一组不同的开关来控制它的内部行为。JBoss AS默认设置了jboss.vfs.forceCopy=true。 要查看所有提供的VFS标志,请查看VFSUtils.java类的代码。
所以我不明白我应该设置什么?
我应该设置-Djboss.vfs.forceNoCopy=true还是-Djboss.vfs.forceCopy=false
或者我应该同时设置两个? 更新 1:
我已经阅读完整个线程:http://community.jboss.org/thread/2148?start=0&tstart=0, 现在我不确定我是否应该更改jboss.vfs.forceCopy或jboss.vfs.forceNoCopy。 根据这个线程,我会遇到内存不足的错误,而不是出现大量文件在tmp目录中。

我遇到了同样的问题,因此我在这个问题上设置了赏金。 - Gnoupi
你有没有得到这个问题的好答案?我也遇到了同样的问题。两台相同的服务器,一台填满了临时文件,另一台看起来没事。而且我认为每分钟创建这些文件也会减慢服务器的速度。 - Daniel Williams
2
@DanielWilliams 我们也遇到了这个问题,虽然我们还没有找到停止 JBoss 生成这些文件的方法,但我们发现在 JBoss 运行时可以安全地从此文件夹中删除旧文件而不影响应用程序。我们使用的命令是“find . -ctime +1 -exec rm {} ;”从 vfs-nested.tmp 文件夹内部删除 24 小时前的文件(可能会有所不同)。我们相当确定问题与使用符号链接指向我们的可部署文件有关,也许与使用 Twiddle 进行部署有关。请参阅 JBoss 论坛! - Rich
与http://serverfault.com/questions/128458/jboss-5-1-0-ga-and-huge-vfs-nested-tmp相关的内容。 - Jon Onstott
6个回答

4
从这里开始:http://sourceforge.net/project/shownotes.php?release_id=575410 "tmp目录中存在过多的nestedjarNNN.tmp文件。VFS通过在java tmp目录中提取嵌套的jar文件来解包嵌套的jar文件。这可能会导致大量文件填满tmp目录。您可以通过在启动jboss时使用的命令行上设置-Djboss.vfs.forceNoCopy=true来禁用此行为。这将在未来的版本中默认启用,JBAS-4389。"

我们的应用程序在不同的主机上运行,只有两个主机出现了这个问题。 为什么不是所有的主机都会出现这个问题呢? - Volodymyr Bezuglyy
这里的问题在于forceNoCopy对内存消耗有明显影响,而不是磁盘空间不足,你会得到OutOfMemoryError。 - Honza

1

我在生产环境中遇到了与上述描述相同的问题,并通过以下解决方案解决了该问题。

添加Java选项

    -Djboss.vfs.cache=org.jboss.virtual.plugins.cache.IterableTimedVFSCache
    -Djboss.vfs.cache.TimedPolicyCaching.lifetime=1440

我的设置还定义了其他部署目录,因此我需要将这些附加目录添加到位于$JBOSS_SERVER_HOME/conf/bootstrap/的vfs.xml文件中,以便看到好处。

我认为lifetime设置是以分钟为单位的,因此我将其设置为一天,因为我在夜间安排了服务器重启。

在找到这个解决方案之前,我还尝试使用-Djboss.vfs.forceNoCopy=true-Djboss.vfs.forceCopy=false

这似乎起作用了,但我注意到应用程序运行得更慢-可能是因为这些设置关闭了vfs缓存。

我的Jboss版本是jboss-5.1.0.GA,我的应用程序在生产中运行在集群中。


1

jskaggz 给出了一个很好的答案。此外,我在我的 run.bat 文件开头加入了以下内容:

rmdir /s /q c:\apps\jboss-5.1.0.ga\server\default\tmp
rmdir /s /q c:\apps\jboss-5.1.0.ga\server\default\work
rmdir /s /q c:\apps\jboss-5.1.0.ga\server\default\log
mkdir       c:\apps\jboss-5.1.0.ga\server\default\tmp
mkdir       c:\apps\jboss-5.1.0.ga\server\default\work
mkdir       c:\apps\jboss-5.1.0.ga\server\default\log
echo --- Cleared temp folders ---

我曾经遇到过旧类的问题,它们一直存在,所以这似乎有所帮助。


我们的应用程序在不同的主机上运行,只有两个主机出现了这个问题。 为什么不是所有的主机都会出现这个问题呢? - Volodymyr Bezuglyy

1

0

我们曾经遇到同样的问题,通过使用农场目录作为部署目录来规避了这个问题。

在实施这个过程后,由于我们的DEV环境的特性(我们有集群环境,许多开发人员在共享的DEV环境上进行部署),我们面临着另一个问题,即在以这种方式部署EAR和WAR时无法获得一致的结果。我们通过确保部署的EAR和JAR在服务器上被TOUCHED(http://en.wikipedia.org/wiki/Touch_(Unix))来规避这个问题,以确保避免不一致性。


0

发现很多人在集群(或农场)环境下遇到了同样的问题。 https://issues.jboss.org/browse/JBAS-7126 描述了将农场目录作为部署目录来解决该问题。

我使用第二个部署目录也遇到了同样的问题。 来自这个第二个部署目录的应用程序中的 jar 文件被复制直到磁盘满为止。

尝试按照 https://issues.jboss.org/browse/JBAS-7126 中描述的方式添加第二个部署目录,结果非常好!

它运行良好!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接