Java是将类保留在内存中还是只保留对象?

时间:2013-09-24 17:28:27

标签: java class object memory instantiation

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

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

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

2 个答案:

答案 0 :(得分:3)

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

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

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

  

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

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

答案 1 :(得分:0)

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

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

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