我是Java的新手,我的英语不够好,我希望每个人都能原谅我。
问题1: 我有一个ArrayList(J2SE)或Vector(J2ME),我有一个类(例如:Bullet),当我开火时,我将该类的一个实例添加到List中,在子弹击中目标后,我需要销毁它们并从列表中删除它们。我想问:如何删除我需要删除的完整对象,我的意思是:释放该对象所占用的所有内存(与C ++中的删除指针相同)。使用普通对象,我们可以使用" = null",但是在这里,这个对象在List中,我们不能这样使用。我尝试使用System.gc(),但这是一个坏主意,程序将减慢和内存增加超过我不使用gc()。如果我只使用List.remove(bullet_index),内存会增加一点,但不会减少。
问题2: 有任何其他想法用#34;无限数量的子弹"和记忆安全。
我制作一个简单的2D射击游戏
答案 0 :(得分:3)
你根本做不到。 Java在JVM上工作,JVM通过garbage collector为内存的分配和释放提供托管环境。
您可以通过释放未使用的对象来提示JVM清理内存,但这通常不是它的使用方式。只需从列表中删除Bullet
实例,如果没有其它引用,则最终将释放其内存。
如果你真的想要节省内存,你应该考虑重复使用相同的实例,如果你计划在屏幕上同时拥有最多精确数量的项目符号,那么可以这样做,所以不要从列表中删除过期的,你可以将它们添加到另一个列表,然后用于获取新的项目符号(通过设置它们的属性)。通过这种方式,您可以避免超过某个阈值。
答案 1 :(得分:1)
Java是内存管理的,因此无法可靠地释放内存。只要有指向对象的指针,就可以确保不会释放内存。将对象设置为null意味着没有任何内容指向它,但并不一定意味着它将在那时被垃圾收集。有关Java中内存管理的深入说明,请检查this out。
另外,避免使用矢量 - 它们是同步的,通常不会在较新的代码中使用。