-1

我假设答案很明显,但我是编码新手,找不到明确的答案。

这就是我问的原因:我在棒球比赛中有一个“快球”课程,其中有 10 个独特的数据集(10 个难度级别)用于投出的快球,还有 1 个空白数据集。当从类中构造一个对象时,它会根据难度将空白数据集设置为 10 个数据集中的 1 个。请注意,任何时候都只有 1 个“快球”对象。

我担心这个类中的所有 10 个数据集都将保留在 Java 的内存中,即使只使用了 1 个。这是一个合理的担忧吗?还是对象是唯一保存在内存中的东西?

4

2 回答 2

3

Java 将加载该类并将其放入 jvm 内存的永久生成部分,这将发生在您在代码中使用的每个类中。这部分称为永久代。除非使用带有热部署的应用程序容器,否则您很可能不需要担心这部分。

您创建的对象保存在内存的不同部分(实际上是不同的代),称为堆,在不同的代中再次划分。jvm 将以 jvm 认为好的方式对对象进行排序,并且做得很好。在一代短期对象中被分类的对象会被更积极地清理,而永久代通常根本不会被清理。垃圾收集器将在没有对这些对象的引用后进行清理,并释放使用的内存。

由于您没有提供代码,因此很难说您的程序将如何工作。

我担心这个类中的所有 10 个数据集都将保留在 Java 的内存中,即使只使用了 1 个。这是一个合理的担忧吗?还是对象是唯一保存在内存中的东西?

取决于您是否保留对这些快球对象的引用。如果您一次只引用一个快球对象,垃圾收集器最终会清理未引用的对象。

于 2013-09-24T17:37:09.527 回答
0

如果您的数据集是 Fastball 类的实例,它们将保留在内存中,直到不再被引用。如果您的程序不再引用它们,那么垃圾收集将释放与这些对象关联的内存。如果您的程序不断维护对它们的引用,那么它们将保留在内存中。

除非您的 Fastball 类存储的数据非常大,否则在内存中拥有 10 个 Fastball 对象应该不是问题。相反,如果数据非常大,您可以将数据存储在单独的文件中并将其读取到 Fastball 类的单个实例中,并且每次您想从磁盘加载新实例时覆盖该实例的引用。这使得程序只在内存中维护一个 Fastball 引用,因此前一个实例将通过垃圾收集从内存中删除。

请注意,您的程序将明显变慢,因为它必须在使用之前从磁盘加载信息。

于 2013-09-24T17:36:50.403 回答