2013-09-24 54 views
-2

我假设答案是显而易见的,但我是编码新手,找不到明确的答案。Java是否将内存中的类保留或只是对象?

这就是为什么我问:我有一个棒球比赛中的“快球”课,它有10个独特的数据集(10个难度级别),一个快速球和1个空白数据集。当从这个类构造一个对象时,它根据难度将空白数据集设置为10个数据集中的一个。请注意,任何时候只有1个“快球”对象。

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

+0

什么是_unique集data_? –

+4

如果你想给我们一个简短但完整的代码,而不是仅仅描述它,那真的很有帮助。 –

+0

不要担心有10个对象:) Java将加载该类并将其放到jvm内存的永久生成部分,这会发生在您在代码中使用的每个类中。这些对象保存在Garbace收集器将处理的内存(堆)的不同部分 – Zavior

回答

0

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

除非您的Fastball类存储的数据非常大,否则在内存中有10个Fastball对象应该不成问题。如果数据非常大,则可以将数据存储在单独的文件中,并将其读入Fastball类的单个实例,并且每次要从磁盘加载新实例时,都会覆盖此实例的引用。这使得程序仅在内存中维护一个Fastball引用,所以前一个实例将通过垃圾回收从内存中移除。

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

2

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

您创建的对象被保存在内存的不同部分(实际上是不同的一代),称为堆,在不同代中再次分割。 jvm会以jvm认为是好的方式对对象进行排序,并且做得很好。在一代短生命的对象中进行排序的对象得到更积极的清理,而永久生成的对象通常不会被清理干净。在没有引用这些对象的情况下,垃圾收集器将处理清理并释放所使用的内存。

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

我担心此类中的所有10个数据集都将保留在 Java的内存中,即使只有1个正在使用。这是一个合法的 关注?或者是唯一保存在内存中的对象?

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

相关问题