【发布时间】:2013-08-06 14:01:49
【问题描述】:
我的问题比较具体,因此很难搜索。我是 编程Java和学习语言。我设计了一堂课, 称为实验,我在其中定义了所有的通用函数 实验和默认参数。
对于每个特定的实验,比如 ExperimentA,然后我将 Experiment 子类化。每次我想运行实验 A 时,我都会创建一个 ExperimentA 的实例,将参数传递给构造函数,然后该构造函数会覆盖 Experiment 中定义的默认参数。我有两个问题。我在同一篇文章中发布了这两个问题,因为我认为它们可能相关。
1) 上面的设计合理吗?最初我想使用 接口,但我发现接口中的值必须是 常量,因此不可能覆盖参数。
2) 在更改参数后运行多个相同类型的后续实验时,我遇到了内存泄漏问题。
for(int na:ArrayOfIntegers) {
Experiment e1 = new ExperimentA(na,otherArgs);
Experiment.runExperiment(e1);
}
由于某些原因,即使 e1 已分配给新的 ExperimentA 对象,由 e1 对象保留的对象仍会在堆中保持活动状态。我知道这是一个非常笼统的问题,但我是 Java 新手,一些关于问题可能是什么的猜测可能会对我有所帮助。
我知道的唯一不当行为是将 Experiment 中的默认变量设为 public,而不是私有并使用 getter,但我看不出在这种情况下这会如何导致任何问题。在执行 runExperiment() 函数并创建另一个 ExperimentA 对象后,基本上没有对 e1 对象的引用。有什么想法吗?
【问题讨论】:
-
您如何确切地知道对象保持活动状态?你用什么做堆检查?
-
我使用内存分析器工具,并转到泄漏嫌疑人报告。
-
我检查了链接,并确认问题仍然存在,即使我不使用 for 循环,就像这样:
Experiment e1 = new ExperimentA(rootFolder, 30, fixedLatency, nSTOrdersPerRound);Experiment.runExperiment(e1);Experiment e2 = new ExperimentA(rootFolder, 31, fixedLatency, nSTOrdersPerRound);Experiment.runExperiment(e2);即使有在e1.runExperiment执行后没有对e1 的引用,所有由e1 创建的对象都被保留。 :s
标签: java for-loop memory-leaks reference subclassing