Java和内存泄漏
在离开爪哇岛5年后,我将返回爪哇岛。如果我没记错的话,垃圾收集器会在后续调用Java和内存泄漏,java,memory-leaks,Java,Memory Leaks,在离开爪哇岛5年后,我将返回爪哇岛。如果我没记错的话,垃圾收集器会在后续调用setListAdapterString(String[]data)后启动并收集“新”内存。更一般地说,在使用JVM时产生内存泄漏时,是否有人有他们喜欢使用的首选文档集 import android.app.ListActivity; import android.os.Bundle; import android.widget.ArrayAdapter; import android.widget.ListAdapte
setListAdapterString(String[]data)后启动并收集“新”内存。
更一般地说,在使用JVM时产生内存泄漏时,是否有人有他们喜欢使用的首选文档集
import android.app.ListActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListAdapter;
public class MainActivity extends ListActivity {
private ListAdapter mListAdapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_main);
createAdapter();
setListAdapter(mListAdapter);
}
protected void createAdapter() {
// Create some mock data
String[] testValues = new String[] {
"Hello",
"Welcome",
"The",
"Java",
"Test",
"World",
};
setListAdapterStrings(testValues);
}
public void setListAdapterStrings(String [] data) {
mListAdapter = new ArrayAdapter<String>(
this,
android.R.layout.simple_list_item_1,
data);
}
}
导入android.app.ListActivity;
导入android.os.Bundle;
导入android.widget.ArrayAdapter;
导入android.widget.ListAdapter;
公共类MainActivity扩展了ListActivity{
私有列表适配器;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_main);
createAdapter();
setListAdapter(mListAdapter);
}
受保护的void createAdapter(){
//创建一些模拟数据
字符串[]测试值=新字符串[]{
“你好”,
“欢迎”,
",,
“爪哇”,
“测试”,
“世界”,
};
SetListAdapterString(测试值);
}
public void setListAdapterString(字符串[]数据){
mListAdapter=新阵列适配器(
这
android.R.layout.simple\u list\u item\u 1,
数据);
}
}
不,这不是内存泄漏。Java不需要显式释放-ing内存。现在不可引用的ListAdapters
将来将由垃圾收集器收集
通常,内存以两种方式泄漏:
无意中保留的引用太长
未正确处理较低级别的资源(数据库连接、套接字等)
在第一种情况下,“泄漏”实际上是一个用词不当的词。它仍然可以访问,这就是为什么它没有被收集,所以不能说它已经泄漏,但它可能不再被使用了 理论上,Java不会“泄漏”。然而,Android Java不是Java,一些与系统相关的对象(尤其是图像)可能会“泄漏”,需要通过几种机制之一释放。不过,我已经离开安卓大约3年了,所以我不记得细节了。@SotiriosDelimanolis阅读了上面的问题。我问,如果我在以后重新调用MistLealAddio.@ MatthewHoggan时,会对StistListAdvTelString(String)数据产生内存泄漏。SotiriosDelimanolis谢谢,我过去4年一直在做C++开发,当涉及到内存泄漏时,我是一个精神分裂症患者。我知道Java可能会有“内存泄漏”,当你在堆上放了太多东西,并将其保持在范围内,这样垃圾收集器就无法清理。“我只是在寻找其他我需要注意的案例。@马修霍根意识到这一点很好。更多的人应该选择需要和不需要内存管理的语言。使用android,查看Hot Clicks所说的话。感谢您的清晰描述。从C++回到java可能是危险的事情,不危险…简单一点。垃圾收集简化了许多其他代码,否则您将不得不在C++中进行编码。当引用超出C++的范围时,只要对另一个对象的另一个引用没有保留在别处,那么该对象就自动成为符合条件的集合,而不需要任何进一步的输入。上面提到了Java中可能出现内存泄漏的唯一情况,以及您自己开始有效地管理内存的情况(例如,当您在代码中管理缓存大小时)。