Java 通过进程标识打开的FileOutputStreams
我们的Java应用程序中存在内存泄漏,因为FileOutputStream打开-关闭差异的数量随着时间的推移而增加。在我们的例子中,堆相当稳定,但由于FileOutputStreams是打开的,所以JVM本机内存中面临内存泄漏Java 通过进程标识打开的FileOutputStreams,java,memory-leaks,jprofiler,yourkit,Java,Memory Leaks,Jprofiler,Yourkit,我们的Java应用程序中存在内存泄漏,因为FileOutputStream打开-关闭差异的数量随着时间的推移而增加。在我们的例子中,堆相当稳定,但由于FileOutputStreams是打开的,所以JVM本机内存中面临内存泄漏 您能否建议一种方法,让我们能够识别代码库中可能导致此泄漏的代码段。在Linux系统上lsof将帮助您识别哪些文件句柄处于打开状态,如果您识别出可能有助于跟踪代码中未正确关闭资源的位置的名称 然而,如果您只是使用一个好的IDE,当资源面临无法关闭的风险时,他们会发出警告,那
您能否建议一种方法,让我们能够识别代码库中可能导致此泄漏的代码段。在Linux系统上
lsof
将帮助您识别哪些文件句柄处于打开状态,如果您识别出可能有助于跟踪代码中未正确关闭资源的位置的名称
然而,如果您只是使用一个好的IDE,当资源面临无法关闭的风险时,他们会发出警告,那么有一种更简单的方法
例如,Eclipse在这一行上标记一条警告,指出fis1
可能未正确关闭:
FileInputStream fis1 = new FileInputStream(file);
。。。如果更改为,警告将消失:
try(FileInputStream fis2 = new FileInputStream(file)) {
}
在Linux系统上,
lsof
将帮助您确定哪些文件句柄处于打开状态,以及您是否能够识别名称,这些名称可能有助于您跟踪代码中未正确关闭资源的位置
然而,如果您只是使用一个好的IDE,当资源面临无法关闭的风险时,他们会发出警告,那么有一种更简单的方法
例如,Eclipse在这一行上标记一条警告,指出fis1
可能未正确关闭:
FileInputStream fis1 = new FileInputStream(file);
。。。如果更改为,警告将消失:
try(FileInputStream fis2 = new FileInputStream(file)) {
}
在JProfiler中,您可以找到未关闭的FileOutputStreams的分配点,如下所示:
在JProfiler中,您可以找到未关闭文件输出流的分配点,如下所示:
YourKit profiler自动查找所有未关闭的文件输入流:
- 捕获并打开内存快照
- 选择“检查”选项卡
- 在检查树的“其他内存异常”节点中查找。它包含“待完成的非关闭资源”
- 进行检查
探查器还能够查找非关闭的文件、目录流、终结器中关闭的流以及许多其他问题。有关更多详细信息,请访问YourKit profiler自动查找所有未关闭的文件输入流:
- 捕获并打开内存快照
- 选择“检查”选项卡
- 在检查树的“其他内存异常”节点中查找。它包含“待完成的非关闭资源”
- 进行检查