2010-08-23 2 views
5

나는 system.gc()를 호출하고자하는 자바 애플리케이션을 가지고있다. 메모리를 해제하는 것이 합리적인 방법입니까? 또는 다른 조언? 정말 감사합니다!`System.gc()`를 Java 애플리케이션의 메모리를 관리하는 좋은 방법이라고 부릅니까?

+0

http://stackoverflow.com/questions/3499937/for-java-as-free-in-c-or-delete-in-c/ – JBirch

+3

비슷한 질문 : http://stackoverflow.com/questions/66540/system-gc-in-java, http://stackoverflow.com/questions/2414105/why-is-it-a-bad-practice-to-call-system-gc, http : // stackoverflow .com/questions/2373792/관련 가비지 콜렉션 - 왜 필요합니까? -call-system-gc, http://stackoverflow.com/questions/1083935/what-exactly-takes-place-behind –

+0

나는 system.gc()를 사용하는 사람을 거의 보지 못했다. –

답변

12

변수 참조 만 중지하십시오. System#gc()을 직접 호출 할 필요는 없습니다. JVM이 OutOfMemoryError의 가장자리에있는 경우 이 GC를 실행합니다.

정말로이 필요하기 때문에 변수 참조를 중단 할 수없는 경우 응용 프로그램의 프로필을 작성하여 메모리 누수를 수정하거나 시작시 JVM을 더 많이 사용하도록 지정해야합니다.

+2

System.gc()를 호출했다고해서 반드시 가비지 컬렉터가 실행됩니다. 이것은 단지 요청 일 뿐이며, 영예를 얻거나받지 못할 수도 있습니다. –

+2

'gc()'를 호출하는 것은 끔찍한 일이므로 실제로는 호출을 무시하도록 설정할 수있는 시스템 속성이 있습니다. – erickson

-1

gc()를 사용하면 가비지 컬렉터를 호출해야한다고 JRE에게 알립니다. 때때로 그 제안은 유용 할 수 있지만, 대부분의 경우 null에 대한 모든 참조를 설정하는 것이 올바른 방법입니다.

+0

대부분의 경우 참조를 범위에서 제외시키는 것이 올바른 방법입니다. – EJP

5

자바에서는 가비지 수집을 명시 적으로 호출 할 필요가 없습니다. 가상 시스템에 의해 자동으로 수행됩니다.

1

도서 머리 선두 자바는 각 변수 (인스턴스 또는 로컬 변수)에 범위가 있다고 말하면 범위가 손실 된 다음 변수가 더 이상 존재하지 않는다고 말하면 객체에 대해 쓰레기로 처리 할 수 ​​있다고 말합니다 수집가가 마지막 라이브 참조가 사라지면

+0

맞습니다.하지만이 책은 규범 적 참조가 아닙니다. JLS 또는 JVM 사양을 인용해야합니다. – EJP

4

System.gc()으로 전화하지 마십시오. 불필요하게 가비지 컬렉터를 실행하는 것은 프로그램의 성능을 망칠 수있는 좋은 방법입니다. JVM은 필요할 때 쓰레기를 수집합니다.

Java 플랫폼의 가장 큰 장점 중 하나는 성공적인 자동 가비지 수집입니다. 그걸 써.

0

소프트 & 약한 참조는 메모리에 저장하려는 데이터를 유지하는 가장 좋은 방법이지만 메모리가 부족한 경우 수행 할 수 있습니다.

일반적인 참조가 강합니다. 즉, 누군가가 강력한 참조를 보유하고있는 동안 객체가 마무리되거나 가비지 수집되지 않습니다. 객체에 대한 SoftReference를 보유하면 객체는 자동으로 플러시 될 OutOfMemory 상황이 발생할 때까지 메모리에 남아있게됩니다. WeakReference는 언제든지 플러시 될 가능성이 있지만 오브젝트 보유시 디스크 오버 헤드를 절약하는 경우에 유용 할 수 있습니다.

이러한 특성 때문에 참조가 꽉 차기 시작하면 데이터를 플러시하지 않아도 데이터를 캐싱 할 때 유용합니다. 참조를 만들 수

가장 쉬운 방법은 다음과 같이이다 :

Reference<MyClass> r = new SoftReference<MyClass>(new MyClass()) 

지금 당신이 주변에 참조를 전달합니다. 개체를 취득 할 때 당신은 당신이 일시 정지 시간에 대해 신경과 동시 또는 G1 수집을 사용하는 경우 특히 나쁜 전체 컬렉션을 시작합니다)

MyClass myClass = r.get(); 
if (myClass != null) { 
    // do something 
} 
else { 
    // Oh dear class isn't there, go to plan b 
} 
+0

MyClass가 부울을 확장하지 않는 한 실제로 유효한 표기법이 아닙니다. –

+0

예, null 체크를 놓친 경우 업데이트됩니다. – locka

1

으로 System.gc (() Reference.get를 호출합니다.

당신이 다른 행동이 필요하다는 특정한 이유를 격리하지 않으면 가비지 콜렉션을 사용해서는 안됩니다 ... 어떤 이득을 보는 것보다 실적을 해칠 가능성이 더 큽니다.

+0

Javadoc에서 말하는 내용이 아닙니다. 내가 20 년 만에 그것을 본 적이없는 전체 콜렉션을 시작하는 진술이 있다면. 'System.gc()'는 아무것도하지 않거나 아무것도 할 수 없습니다. – EJP

3

매우 구체적인 상황에서만 엄격한 프로파일 링으로 입증 된 후에는 gc()을 명시 적으로 호출하는 것이 좋습니다. 기능적으로 차이를 만들어서는 안되지만 매우 특정 시나리오에서는 으로 인식하여의 성능을 얻을 수 있습니다.

예를 들어, Java로 비디오 게임을 만들고 몇 분 간격으로 휴식을 취한다고 말합니다. 이것은 다음 레벨 (게임 플레이에 영향을 미칠 수 있음)을 재생하는 동안 GC주기가 발생할 가능성을 줄이면 가비지 콜렉터를 명시 적으로 호출하는 좋은 장소가 될 수 있습니다.

요약하면 GC가 가장 바람직 할 때 런타임보다 더 잘 알고있는 시간을 위해 예약되어야하며 다시 한번 포함을 정당화하는 엄격한 프로파일 링 후에 사용해야합니다.

관련 문제