【问题标题】:Java: Delete completely objectJava:完全删除对象
【发布时间】:2012-12-29 03:33:59
【问题描述】:

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

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

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

我在制作一个简单的 2D 射击游戏

【问题讨论】:

    标签: java


    【解决方案1】:

    你根本做不到。 Java 在 JVM 上运行,它通过garbage collector 为内存的分配和释放提供了一个托管环境。

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

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

    【讨论】:

    • 如果重用对象听起来像是您想做的事情,请研究术语“对象池”。我特别推荐它用于子弹等临时物体。
    【解决方案2】:

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

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

    【讨论】:

    • 不幸的是,Java ME 不提供除Vector 之外的任何集合。非常痛苦。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-28
    • 1970-01-01
    • 2020-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多