Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我应该将java对象设为空吗?_Java_Android_Object_Garbage Collection - Fatal编程技术网

我应该将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数组是对砖块的唯一引用,则设置