Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.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_Memory Leaks - Fatal编程技术网

Java和内存泄漏

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

在离开爪哇岛5年后,我将返回爪哇岛。如果我没记错的话,垃圾收集器会在后续调用
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中可能出现内存泄漏的唯一情况,以及您自己开始有效地管理内存的情况(例如,当您在代码中管理缓存大小时)。