如何在不重启Tomcat的情况下定位持有特定文件描述符的Java类实例
如何在不重启Tomcat的情况下定位持有特定文件描述符的Java类实例
Background
- 我在Windows系统上开发一个包含两个及以上WAR包的Web应用。
- 这些WAR包在处理过程中会生成临时文件。
Problem
- 在程序测试时,我发现有一个临时文件没有被删除。尝试通过资源管理器删除它时,收到提示:
The action cannot be completed because the file is open in "java.exe"。 - 显然是某个WAR包还在占用这个文件(提示里明确是
java.exe),但Tomcat上部署了多个WAR包,我无法确定是哪个应用导致的问题。 - 另外这些应用结构复杂,要排查是哪个类通过
FileInputStream/FileOutputStream这类流读写该文件,难度很大。
Question
给定一个特定文件的路径,有没有办法知道是哪个类的实例持有该文件的描述符(比如对应的FileInputStream或FileOutputStream)?
最好能有不需要重启Tomcat的方法(比如使用jcmd这类工具),因为同一台Tomcat上还有其他WAR包在测试中。
备注:内容来源于stack exchange,提问作者SATO Yusuke
相关产品推荐
相关产品推荐

