null在Java中分配未使用的对象引用是否以任何可测量的方式改进了垃圾收集过程?
我用Java语言(C#)的经验告诉我,经常是反直觉的,试图智取虚拟机或JIT编译器,但我已经看到同事用这个方法,我很好奇,如果这是一个很好的做法挑向上或那些巫术迷信编程的一个?
所以我目前正在开发一个程序,它需要能够处理存储在数组中的大量数据,并且需要一种方法来清除数组中的所有内容.对于下面的例子,做记忆明智会是一件坏事吗?我知道垃圾收集器最终会为你清理它,但有没有理由为什么另一个方法(例如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).
假设我有以下代码
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) 我听说指定null explicit的引用将有助于gc收集它.
真的吗?
如果一个对象超出范围,它会快速获得gc吗?
我在一个方法中一次又一次地使用相同的变量并且多次将它引用到一个新对象.从垃圾收集方面来看,它是一个很好的做法,在使它引用一个新对象之前使其无效.
例:
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有一个集合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,即使它将重新分配索引.看起来我应该这样,但代码看起来多余.或者,如果我是正确的,是否有一个不那么冗余的方式来编码呢?我真的很感激不止一句话的答案,我对这个话题非常好奇.
我为我的按钮设置了监听器:
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