【发布时间】:2014-12-19 17:57:50
【问题描述】:
这是关于我观察到的一个场景的问题:有什么方法可以有效地关闭由我无法查看和控制的 Java 库(如 AudioSystems.getAudioInputStream)打开的系统资源?
那么看看我下面的代码sn-p:
public static void main(String[] args) throws UnsupportedAudioFileException, IOException {
System.out.println("Before everthing starts...Number of open fd: " + ((UnixOperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean()).getOpenFileDescriptorCount());
AudioInputStream stream = AudioSystem.getAudioInputStream(new File("CaptchaResource/silence20ms.wav"));
System.out.println("After reading in one AudioInputStream...Number of open fd: " + ((UnixOperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean()).getOpenFileDescriptorCount());
stream.close();
System.out.println("After closing the AudioInputStream...Number of open fd: " + ((UnixOperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean()).getOpenFileDescriptorCount());
stream = AudioSystem.getAudioInputStream(new File("CaptchaResource/silence20ms.wav"));
System.out.println("After reading in one AudioInputStream...Number of open fd: " + ((UnixOperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean()).getOpenFileDescriptorCount());
stream.close();
System.out.println("After closing the AudioInputStream...Number of open fd: " + ((UnixOperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean()).getOpenFileDescriptorCount())
stream = AudioSystem.getAudioInputStream(new File("CaptchaResource/silence20ms.wav"));
System.out.println("After reading in one AudioInputStream...Number of open fd: " + ((UnixOperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean()).getOpenFileDescriptorCount());
stream.close();
System.out.println("After closing the AudioInputStream...Number of open fd: " + ((UnixOperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean()).getOpenFileDescriptorCount());
}
如您所见,我使用以下行来打印程序运行时打开的文件描述符的数量:
System.out.println("Number of open fd: " + ((UnixOperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean()).getOpenFileDescriptorCount());
这是我观察到的输出:
Before everthing starts...Number of open fd: 4
After reading in one AudioInputStream...Number of open fd: 44
After closing the AudioInputStream...Number of open fd: 43
After reading in one AudioInputStream...Number of open fd: 45
After closing the AudioInputStream...Number of open fd: 44
After reading in one AudioInputStream...Number of open fd: 46
After closing the AudioInputStream...Number of open fd: 45
您可以看到,除了第一次从 4 跳转到 44 之外,每次我调用 getAudioInputStream 时,我都会打开另外两个文件描述符。当我在流上调用 close() 时,我只能关闭一个。
所以当我的程序必须连续多次处理这个操作时,我最终会达到 Unix 系统中 1024 个打开文件描述符的限制。
通过查看getAudioInputStream的source code,我不确定这是否与由于可能存在多个提供者而在此方法中打开了多个阅读器有关,不太确定那里的实现细节。
这听起来像是 JDK 中已报告的错误,见于:https://bugs.openjdk.java.net/browse/JDK-8013586
有什么解决方法吗?如何重写代码,避免这种不可控的事情发生?
【问题讨论】:
标签: java audio inputstream ioexception