相关疑难解决方法(0)

在Java中将对象分配为null会影响垃圾回收吗?

null在Java中分配未使用的对象引用是否以任何可测量的方式改进了垃圾收集过程?

我用Java语言(C#)的经验告诉我,经常是反直觉的,试图智取虚拟机或JIT编译器,但我已经看到同事用这个方法,我很好奇,如果这是一个很好的做法挑向上或那些巫术迷信编程的一个?

java null garbage-collection

82
推荐指数
7
解决办法
4万
查看次数

将新数组分配给现有数组以在Java中"清除"数组是不好的做法?

所以我目前正在开发一个程序,它需要能够处理存储在数组中的大量数据,并且需要一种方法来清除数组中的所有内容.对于下面的例子,做记忆明智会是一件坏事吗?我知道垃圾收集器最终会为你清理它,但有没有理由为什么另一个方法(例如for循环并将每个值设置为null)可能比这更好?

Object[] objArray = new Object[n];
/*Do some stuff with objArray*/
objArray = new Object[n]
Run Code Online (Sandbox Code Playgroud)

否则,执行此操作将允许此操作在O(1)时间内运行,而for循环将采用O(n).

java arrays big-o

6
推荐指数
1
解决办法
177
查看次数

Java记忆难题

假设我有以下代码

package memoryleak;

public class MemoryLeak {

    public static int size;

    static {
        size = (int) (Runtime.getRuntime().maxMemory()*0.6);
    }

    public static void main(String[] args) throws InterruptedException {
        {
            byte[] data1 = new byte[size];
        }

        byte[] data2 = new byte[size];
    }
}
Run Code Online (Sandbox Code Playgroud)

此代码生成OutOfMemoryError.您可以使用一个变量分配使这个代码工作(它重写第一个数组使用的堆栈帧,并使make数组可用于垃圾收集).这个难题在这里解释.

{
    byte[] data1 = new byte[size];
}
int i = 0;
byte[] data2 = new byte[size];
Run Code Online (Sandbox Code Playgroud)

问题是:为什么以下代码仍然不起作用?

Object o = new Object();
synchronized (o) {
    byte[] data1 = new byte[size];
}
int i = 0;
byte[] data2 …
Run Code Online (Sandbox Code Playgroud)

java memory-management

3
推荐指数
1
解决办法
556
查看次数

当ref不再使用时,为ref赋值是否有任何优势?

我听说指定null explicit的引用将有助于gc收集它.

真的吗?

如果一个对象超出范围,它会快速获得gc吗?

java garbage-collection

3
推荐指数
1
解决办法
194
查看次数

垃圾收集:是否收集对象

可能重复:
将Java对象设置为null是否会再执行任何操作?

我在一个方法中一次又一次地使用相同的变量并且多次将它引用到一个新对象.从垃圾收集方面来看,它是一个很好的做法,在使它引用一个新对象之前使其无效.

例:

StopWatch watch = new StopWatch();
watch.start();
//some code
watch.stop();
//some code
watch = null;
watch = new StopWatch();
watch.start();
//some code
watch.stop();
//some code
Run Code Online (Sandbox Code Playgroud)

在这种情况下,不确定是否使其无效会对GC产生影响.请指导.

谢谢!

java garbage-collection

3
推荐指数
1
解决办法
288
查看次数

是否有必要在重新分配时将过时的引用设置为null?

让我首先提出我的问题,我正在学习编程/数据结构.是的,我知道Java有一个集合API可以完成我正在编写的代码,但是目前我宁愿首先学习基本思想.

我正在编写一个ArrayList实现,并且在引用变得过时时对垃圾收集感到好奇.所以在我的情况下,我有一个通用的对象数组ie,E[] data = (E[]) new Object[size];并有一个方法E set(int index, E item),将取代data[index]with项目.这是我的方法体:

public E set(int index, E item) {
    if(index<0||index>size-1) throw new IndexOutOfBoundsException(); //Not relevant to question
    E previousValue = data[index];
    data[index]=null; 
    data[index]=item;
    return previousValue;
}
Run Code Online (Sandbox Code Playgroud)

关于我的问题.是否有必要使对象为null,即使它将重新分配索引.看起来我应该这样,但代码看起来多余.或者,如果我是正确的,是否有一个不那么冗余的方式来编码呢?我真的很感激不止一句话的答案,我对这个话题非常好奇.

java arraylist data-structures

1
推荐指数
1
解决办法
556
查看次数

我应该删除onDestroyView中的OnClickListener吗?

我为我的按钮设置了监听器:

  View onCreateView(...) {
    ...
    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //some work
        }
    });
    ...
}
Run Code Online (Sandbox Code Playgroud)

如果我使用ButterKnife,建议打电话给ButterKnife.unbind(this)onDestroyView(){..}.我是否需要删除侦听器以避免内存泄漏?

void onDestroyView() {
    ...
    btn.setOnClickListener(null)
}
Run Code Online (Sandbox Code Playgroud)

android android-lifecycle android-fragments android-memory butterknife

1
推荐指数
1
解决办法
1770
查看次数