如何清除代码后的所有内容?

时间:2011-09-09 08:42:29

标签: java exit

我有一个由外部软件运行的程序。第一次运行总是成功的。第二次运行导致我的软件挂起,因为前一次运行还剩下一些东西(一些对象,一些进程)。我找不到剩下的东西。在我看来,我干净利落,但显然我错了。

有没有一种有效的方法来停止和清理一切?我不能使用exit(0)因为它会杀死外部软件。

ADDED

我使用Java接口在我和外部软件之间进行通信。这样的事情:

mySoftware = new MySoftware(parameters);
my.Software.start();
my.Software.stop();

4 个答案:

答案 0 :(得分:2)

查找泄漏资源的一般方法:

  • 使用VisualVM等分析器显示程序的内存使用情况。
  • 使用Ctrl + Break停止应用程序并检查正在运行的线程,以及可能处于死锁状态的线程。
  • 将调试语句放在代码中以检测它挂起的位置。
  • 通过FindBugs之类的静态代码分析工具运行它,这些工具可能能够识别未正确释放的资源。

找出并解决问题的根本原因是恕我直言总是优于治疗症状。

答案 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;
}