2013-01-15 111 views
0

我是Java新手,我的英文不够好,希望大家都能原谅我。我有一个类(例如:Bullet),当我触发时,我将该类的一个实例添加到列表中,并在子弹命中后目标,我需要销毁它们并将它们从列表中删除。我想问:如何完全删除我需要删除的对象,我的意思是:释放所有对象的内存(与C++中的删除指针相同)。对于普通的对象,我们可以使用“= null”,但在这里,这个对象是在一个List中,我们不能这样使用。我尝试使用System.gc(),但这是一个坏主意,程序会减慢速度并增加内存比我不使用gc()。如果我只使用List.remove(bullet_index),内存会增加一点,但不会减少。Java:完全删除对象

问题2: 有没有其他的想法可以用“无限数目的子弹”和安全的内存来制作枪支。

我正在做一个简单的2D射击游戏

回答

3

你根本就不能。 Java在JVM上工作,通过garbage collector为您的内存分配和释放提供了一个托管环境。

您可以通过释放未使用的对象来提示JVM清除内存,但这通常不是它意味着要使用的方式。从列表中删除Bullet实例,如果没有其他引用,则最终它的内存将被释放。

如果你真的想节省内存,你应该考虑重新使用相同的实例,如果你打算在屏幕上同时有最多的精确数量的子弹,这可以做到,所以相反,从列出过期的一个,你可以将它们添加到另一个列表中,然后用它来拾取新的子弹(通过设置它们的属性)。这样可以避免超过一定的门槛。

+0

如果重复使用对象听起来像是您想要研究的术语“对象池”。我特别推荐它用于像子弹这样的临时物体。 –

1

Java是内存管理的,所以你不能可靠地释放内存。只要有指向对象的指针,就可以确定内存不会被释放。将对象设置为null意味着没有任何指向它的地方,但并不一定意味着它将在那个时候被垃圾收集。有关Java中内存管理的深入说明,请查看this

此外,避免使用矢量 - 它们是同步的,并且通常不用于较新的代码。

+0

不幸的是,Java ME没有提供除Vector之外的任何集合。这是非常痛苦的。 – ApproachingDarknessFish