我应该将java对象设为空吗?
假设我在一个对象数组上迭代我应该将java对象设为空吗?,java,android,object,garbage-collection,Java,Android,Object,Garbage Collection,假设我在一个对象数组上迭代 for (int r = 0; r < rows; r++) { for (int c = 0; c < columns; c++) { if (bricks[r][c] != null) { bricks[r][c].draw(gl) for(int r=0;r
for (int r = 0; r < rows; r++) {
for (int c = 0; c < columns; c++) {
if (bricks[r][c] != null) {
bricks[r][c].draw(gl)
for(int r=0;r
如果我在某个时候想要销毁砖块,我的remove()方法是否应该像以下那样使对象无效:
private void remove(GameBrick obj) {
for (int r = 0; r < rows; r++) {
for (int c = 0; c < columns; c++) {
if (bricks[r][c] != null){
if (bricks[r][c] == obj) {
bricks[r][c] = null;
}
private void remove(GameBrick obj){
对于(int r=0;r
或者它应该将标志boolean exists
设置为false,并在迭代对象时,添加return
或continue
语句(如果bricks[r][c]。exists==false
目前,我的代码基于空值化对象和空值检查,但我后来读到了关于垃圾收集器的内容,将对象设置为空值会使它运行得更频繁
我想知道这是不是真的,我应该怎么做才能最好地删除对象(如果我应该的话)
但我后来读到了关于垃圾收集器和设置
对象设置为null使其运行更频繁
不,那纯粹是道听途说。最好的方法是假设GC已经过优化,以尽可能频繁地运行,从而在性能和内存使用之间取得最佳平衡
将引用设置为null是向GC发出信号表示不再需要该对象的方式。GC不必立即对此进行任何处理
更新
要调整应用程序的性能,您必须测量整个应用程序的行为,这意味着您必须首先编写整个应用程序(或非常现实的端到端模型)。微观优化不起作用
因此,最好的方法是让GC完成它的设计目的——通过自动内存管理,使您能够轻松编写清晰、简单、易于修改的代码。这样,当您在目标机器/设备上测试应用程序时,您可以看到您需要在何处调整性能,只需不要破坏任何东西
性能优化必须通过测量来驱动。测量必须在完整产品的真实原型上进行。因此,在第一次通过实现时,请专注于编写易于修改的代码。然后测量,并仅在实际需要的地方使用混乱的黑客
请记住,它们可能需要位于不同的位置,具体取决于您运行的设备!在某些设备上,应用于特定位置的黑客可能会减慢您的速度,而在另一个设备上则会加快您的速度。因此,您不能盲目地在代码中的任何地方遵循规则。您必须进行测量。是的,将引用设置为null。这就是将导致垃圾回收器为您的应用程序释放更多内存。将引用设置为null不会导致垃圾回收器更频繁地运行,但肯定会帮助它释放更多内存。答案将取决于您的特定代码,但一般来说,对于安卓游戏,您希望避免同样多的垃圾回收n和对象创建(有关详细信息,请参阅)
你知道你将拥有的最大砖块行数和列数吗?你会经常销毁和创建砖块吗?如果是这样,你最好提前分配所有砖块,并使用布尔值指示砖块是否处于活动状态。在将砖块连接到
砖块时,考虑将位置r/c存储在砖块内部代码>容器。然后您不必搜索,只需查看砖块内部。这假设您最多可以将砖块添加到容器中一次
在包含对象的寿命超过代码范围的所有情况下,都要将引用设置为null。不需要将局部变量设置为null,这将在范围的末尾(块的末尾“}”)隐含
我后来读到了关于垃圾收集器的内容,将对象设置为null会使它更频繁地运行
这是不正确的。垃圾收集器按常规计划运行,并且当JVM内存不足时运行。通过设置对null
的引用,您只能增加GC释放的内存量,并减少它所做的工作,因为java中使用的GC类型是O(|非垃圾内存|)
增加释放的内存量会减少O(|非垃圾内存|),这只会降低JVM内存不足的频率,并且不会影响定期计划的运行
我应该怎么做才能最好地移除对象(如果我应该的话)
当不再需要对对象的引用时,将其设置为null
。构造函数,使耗时较长的函数调用使用尽可能少的参数。构造类,使它们松散耦合,其结果之一是长寿命对象的成员数较少。一致地执行此操作,您将我将处于JVM实现者优化过的最佳状态。您希望在游戏中尽可能多地避免GC时间。不要将它们置空,创建一个池,标记死亡的池,而不是实例化新的池,从池中选择一个死亡的池并重新激活它。首先,直接回答您的问题:没有天生的错误将该引用设置为null。请注意,您并不是真正将对象设置为null,而是将对对象的引用设置为null(或者,如果您想学究化,则设置对对象的引用的值)
在您的特定情况下,这是否是一个好主意是另一回事。您当然可以通过不分配或释放对象来最小化垃圾收集(请参阅)。我很想从其他似乎不同意的人那里看到相反的证据。如果您的2D数组是对砖块的唯一引用,则设置