2013-01-15 41 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