2013-07-09 2 views
1

5 년간의 휴식 후에 Java로 돌아갑니다. 정확히 기억한다면 가비지 컬렉터는 setListAdapterStrings(String [] data)?을 호출 한 후 '새로운'메모리를 수집하고 수집합니다.보다 일반적인 것은 JVM을 사용하는 동안 메모리 누출을 생성 할 때 사용하려는 기본 설정이 누구에게나 있습니까?Java 및 메모리 누수

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); 
    } 
} 
+0

누출 위치는 어디입니까? –

+2

이론상 Java는 "누출되지 않습니다". 그러나 Android Java는 Java가 아니며 여러 시스템 관련 객체 (특히 이미지)가 "누출되어"여러 메커니즘 중 하나를 통해 해제해야 할 수 있습니다. 약 3 년 동안 Android에서 떨어져 있었기 때문에 자세한 내용은 기억하지 않습니다. –

+0

@SotiriosDelimanolis 맨 위 질문을 읽으십시오. mLList를 다시 새로 만들 때 setListAdapterStrings (String [] data)에 대한 후속 호출을 수행하면 메모리 누수가 발생하는지 묻는 것입니다. –

답변

3

아니요, 메모리 누수가 아닙니다. Java는 명시 적으로 free- 메모리를 필요로하지 않습니다. 현재 참조 할 수없는 ListAdapters은 나중에 Garbage Collector에 의해 수집됩니다.

일반적으로 메모리는 자바 두 가지 방법으로 유출되어

  1. 실수로
  2. 가 제대로 낮은 수준의 자원을 폐기 (데이터베이스 연결, 소켓 등)하지 너무 오래 참조를 유지.

첫 번째 경우 "누출"은 실제로 잘못된 이름입니다. 여전히 도달 할 수있어 수집되지 않아 누설 된 것으로 말할 수는 없지만 은 더 이상 사용되지 않습니다. 더 이상 사용되지 않습니다.

+0

명확한 설명 주셔서 감사합니다. C++에서 Java 로의 이전은 위험 할 수 있습니다. –

+0

위험하지 않습니다 ... 단순합니다. 가비지 콜렉션은 C++로 코딩해야하는 많은 것들을 단순화합니다. 참조가 C++의 범위를 벗어나면 동일한 객체에 대한 다른 참조가 다른 곳에 유지되지 않는 한 해당 객체는 더 이상 사용자 입력없이 자동으로 수집 할 수있게됩니다. Java에서 메모리 누수가 발생할 가능성이있는 유일한 상황은 위에서 언급 한 것과 효과적으로 메모리를 직접 관리 할 때 (예 : 코드에서 캐시 크기를 관리 할 때)입니다. – scottb