我有一个由外部软件运行的程序。第一次运行总是成功的。第二次运行导致我的软件挂起,因为前一次运行还剩下一些东西(一些对象,一些进程)。我找不到剩下的东西。在我看来,我干净利落,但显然我错了。
有没有一种有效的方法来停止和清理一切?我不能使用exit(0)
因为它会杀死外部软件。
ADDED
我使用Java接口在我和外部软件之间进行通信。这样的事情:
mySoftware = new MySoftware(parameters);
my.Software.start();
my.Software.stop();
答案 0 :(得分:2)
查找泄漏资源的一般方法:
找出并解决问题的根本原因是恕我直言总是优于治疗症状。
答案 1 :(得分:0)
我建议你做一些测试/调试/ (resource-)logging / memory-profiling / static analysis / pluggable type-checking来查找原因,然后将其删除。
如果您正在进行测试并且“剩下的内容”可能是文件,那么您可以使用junit's TemporaryFolder-rule轻松查看,请参阅e.g. this introduction。
答案 2 :(得分:0)
您可以从代码上运行Google singleton detector开始,并检查清理代码是否也处理单例实例。
作为一个后续内容,你可以看看重构那些不一定是单例的单例实例,而是用代码使用依赖注入替换它们(分配要使用的对象并通过所使用的实例的交换器传递它)通常是一个更好的解决方案。)
答案 3 :(得分:0)
将最佳值分配给您在代码末尾创建的对象始终是一个好习惯。如果有任何try / catch块,它可以放在finally块中。这不会立即从内存区域清理对象,但它会让垃圾收集器知道这些对象可以被清除。
您的示例代码。
try{
HSSFWorkbook workBook = new HSSFWorkbook();
HSSFSheet sheet1 = workBook.createSheet("Log_Report");
HashMap<Integer, HSSFRow> hashMapRow = new HashMap<Integer, HSSFRow>();
...
}
catch{}{
...
}
finally{
sheet1=null;
workBook=null;
hashMapRow=null;
}