2017-10-22 2 views
4

나는 오랫동안 실행되는 함수를 가지고 있으며, 그 함수 내에서 객체를 선언하고 할당한다. 이제는이 객체가 메모리에서 적어도이 함수가 실행 중일 때만 살면 알 수 있다고 생각합니다. 이후에는 다른 객체가 참조하지 않으면 가비지 수집을 위해 사용할 수 있습니다. 이제는 함수가 실행되기 전에이 객체를 가비지 컬렉션에 사용할 수있게하려고합니다. 나는 for 루프가 시작되기 전에 가비지 컬렉션에 사용할 수에 반대 원하는 위의 작업에서 이제어떻게 Java에서 함수의 일부분에 대해서만 객체를 메모리에 살게 할 수 있습니까?

 public void foo(){ 
      String title; 
      Object goo=getObject(); //getObject is some other function 
    //which returns Object and can be null and I want Object to be in memory from here 
      if(goo!=null)title=goo.getString("title"); 
      //after the last line of code I want Object to be available for garbage 
    // collection because below is a long running task which doesn't require Object. 

       for(int i=0;i <1000000;i++)  //long running task 
     { 
     //some mischief inside with title 
     } 

      } 

: 코딩 mannger합니다. 루프를 중괄호 안에 넣기 전에 두 줄의 코드를 묶는 것과 같은 작업을 수행 할 수 있습니까?이 작업을 수행하기 위해 수행 할 수있는 작업이 없으면 어떻게해야합니까?

+0

개체가 메모리에 많이 존재합니까? 이것이 당신이 이것을하고 싶은 이유입니까? –

+0

나는 일반적으로 질문을했습니다. 이유는 그들이 크거나 작은 날씨에 불필요한 물체를 메모리에 보관해야하는 이유입니다. –

+1

작은 물체 및 메모리 부족 및 메모리 부족 문제가 발생해도 신경 쓸 필요가 없습니다. 또한 GC는 비 결정적입니다. 그래서 그것을 null에 할당한다고해서 즉시 수집된다는 것을 보장하지는 않습니다. –

답변

4

아무 것도하지 않더라도 루프 중에 개체가 유지되지 않습니다. 자바는 코드가 마지막 액세스 시점을 지나면 객체에 접근 할 수 없다는 것을 알게 될 것이다.

도달 가능한 개체는 모든 실제 스레드에서 계속되는 잠재적 계산에서 액세스 할 수있는 개체입니다. 요즘 JVM은 도달 가능성을 계산할 때 매우 똑똑합니다. 루프 도중 또는 후에 루프에 goo에 액세스 할 수있는 코드 연속이 없다는 것을 알게되면 Java는 마지막 액세스 지점 이후에 객체를 가비지 수집 대상으로 만듭니다. 마지막 액세스 검사기가 매우 보수적 인 경우에도 goo에 대한 액세스가 없으면 JVM에 객체에 더 이상 도달 할 수 없다는 것을 알리는 데 충분합니다.

자세한 내용은 this Q&A을 참조하십시오.

3

개체를 완료 한 후에 nullgoo을 할당하면 goo을 통해 더 이상 연결할 수 없습니다. 도달 할 수있는 다른 것이 없으면 가비지 콜렉션을받을 수 있습니다. goo 변수가 범위 벗어나도록

코드를 정렬 같은 효과를 가지고 있지만, 그 방법은 JIT 컴파일러에 따라 달라집니다/GC의 ablity는 밖으로의 범위 변수의 추적을 최적화 할 수 있습니다. 플랫폼에 따라 다릅니다.

+0

코드를 중괄호로 묶는 것도 같은 일을합니까? –

+0

그 대답은 구현에 따라 다릅니다. –

2

당신은 당신이 아무것도 다른 참조를하면 당신이 그것을하고 GC에서 필요로하는 정보가 개체를 수집 할 수 있습니다 얻을 후

goo = null; 

를 할당 시도 할 수 있습니다. 다른 아이디어를 들어

Marking an Object To Be Removed In The GC

+0

코드를 중괄호로 묶는 것이 동일한 일을합니까? –

2

당신은 block에서 변수, 함수 호출 및 if 테스트를 넣을 수 있습니다 참조하십시오. 마찬가지로,

{ // <-- add this 
    Object goo = getObject(); 
    if (goo != null) { // <-- just because you can omit braces, doesn't mean 
         //  you should. 
     title = goo.getString("title"); 
    } 
} // <-- and this, and then goo is out of scope. 
+0

if 문에 한 줄의 코드 만있는 경우 중괄호를 생략해서는 안되는 이유는 무엇입니까? –

+1

@cartik 중괄호를 생략하면 특히 중첩 된 경우 미묘한 (또는 그렇게 미묘하지 않은) 버그를 쉽게 삽입 할 수 있습니다. 그러나 일반적으로 연습에 대해 권장 할 정도로 충분합니다. –

관련 문제