0

我是Java新手,英语不够好,希望大家见谅。

问题 1:我有一个 ArrayList(J2SE) 或 Vector(J2ME),我有一个类(例如:Bullet),当我开火时,我将该类的一个实例添加到列表中,在子弹击中目标后,我需要销毁它们并将它们从列表中删除。我想问:如何完全删除我需要删除的对象,我的意思是:释放该对象占用的所有内存(与 C++ 中的删除指针相同)。对于普通对象,我们可以使用“= null”,但是在这里,这个对象是在一个列表中,我们不能这样使用。我尝试使用 System.gc(),但这是个坏主意,与我不使用 gc() 相比,程序会变慢并且内存增加更多。如果我只使用 List.remove(bullet_index),内存会增加一点,但不会减少。

问题2:有没有其他想法可以用“无限数量的子弹”和记忆安全的枪射击。

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

4

2 回答 2

3

你根本做不到。Java 在 JVM 上工作,它为通过垃圾收集器分配和释放内存提供了一个托管环境。

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

如果您真的想节省内存,您应该考虑重用相同的实例,如果您计划在屏幕上最多同时显示精确数量的项目符号,则可以这样做,而不是从列表中删除过期的项目符号您可以将它们添加到另一个列表中,然后用于拾取新子弹(通过设置它们的属性)。通过这种方式,您可以避免超过某个阈值。

于 2013-01-15T03:56:16.647 回答
1

Java 是内存管理的,因此您无法可靠地释放内存。只要您有指向对象的指针,您就可以确定不会释放内存。将对象设置为 null 意味着没有任何东西指向它,但并不一定意味着它将在那时被垃圾收集。有关 Java 内存管理的深入解释,请查看内容。

另外,避免使用向量——它们是同步的,通常不会在较新的代码中使用。

于 2013-01-15T03:56:31.377 回答