2013-10-31 4 views
0

를 강제로 때까지 메모리에 보관 :개체 나 같은 코드를 가지고 GC

public static class Obj {//Class within class 
Long a; 

} 

private static final Map<String, Obj> map = new ConcurrentHashMap<>(); 

public static void main(String[] args) 
{ 
    for(long l = 0;l<10000090L;l++) 
    { 
     Obj o = new Obj(); 
     o.a = l; 
     map.put("asd", o); 
     map.remove("asd"); 
    } 
} 

를 내 PC에 내가 스레드에서이 코드를 추가 한 - 그래서 쉽게 메모리 사용량을 볼 수 있습니다. 귀하의 키트 Java Profiler로 프로파일 링을 시작했습니다.

나는 VM에 추가 인수를 추가했습니다 : -XX : + UseConcMarkSweepGC -XX : + UseTLAB -XX : + CMSIncrementalMode -XX을 : CMSIncrementalPacing

이 가

이 프로그램을 테스트하는 내 결과 +를 : 를 반복하기 전에 당신의 키트가 표시되고 - 사용자 파 서버 공간 0 바이트, 사용자 파 에덴 공간 12 메가 바이트, 사용 된 CMS 올드 젠 0 바이트 당신의 키트가 보여주고있는 것 후 - 사용자 파서 공간 8 KB, 사용자 파 에덴 공간 38 메가 비트, 사용 된 CMS 구 세대 0 바이트 1 , 6 mb

다음 가비지 수집기를 강제 실행하면 결과 : 키트가 표시됩니다 - 사용자 파 서버 공간 0 바이트, 사용자 파인 공간 1,4MB, 사용 된 CMS 이전 Gen 1,5 mb

그래서이 값을 올바르게 읽으면 Obj 또는 "asd"가 전체 가비지 수집기가 될 때까지 메모리에 남아 있습니다. 가비지 컬렉터가 프로그램의 모든 객체에 액세스 할 수 있는지 확인하기 위해 대기하지 않고 해당 객체를 실시간으로 제거 할 수있는 방법이 있습니까?

+0

이 코드에서 시작된 스레드가 없습니다. – njzk2

+1

척 노리스 만 청소기를 강제로 청소할 수 있습니다! –

+0

1. Java가 실행될 필요가있을 때 GC가 실행됩니다. 2. Java는 GC 실행시기를 결정할 때 당신보다 훨씬 똑똑합니다. –

답변

2

가비지 수집기가 필요할 때마다 점프하고 대부분의 경우 가장 최적화 된 시간에 점프합니다. System.gc()을 사용하여 GC를 트리거하도록 수동으로 요청하면 전혀 도움이되지 않을 수 있습니다.

또한 "abj"가 full gc까지 머물고 있는지 어떻게 알 수 있습니까? 귀하의 에덴 세대는 구세대에서 38 메가 바이트 공간과 0 메가 바이트를 차지했습니다. 짧은 수명의 개체를 사용하는 경우에는 예상되는 동작입니다. (그리고 매우 작은 속도로 삽입하고 매우 빠르게 eden을 채우지 않으면 일반적으로 작은 gc가 작동합니다.)

+0

테스트 용으로 작은 GC를 어떻게 실행할 수 있습니까? 또한 세계를 멈추지 않는 전체 GC를 강제하는 방법이 있습니다 (ConcMarkSweepGC 사용) – user2618929

+0

작은 GC 나 전체 GC를 트리거 할 수 없습니다. 'System.gc'를 호출하면 콜렉터에게 수집을 요청합니다. 현재 상태에 따라 수집을 선택할지 여부를 선택할 수 있습니다. 그리고 만약 그렇다면 현재의 메모리 사용률에 기반하여 만 풀을하는 것을 선호 할 것입니다. IMHO 그것을 할 수있는 방법이 없습니다 ... 두 번째 부분에 대해, ConcMarkSweepGC는 가장 적은 양의 일시 중지를 제공하고 세계를 멈추는 아주 작은 시간이 있어야합니다. 여전히 불만이라면 azul 시스템 JVM을 사용해보십시오. 그들은 언제든지 고원을 멈추지 않습니다. – Jatin

+0

일반적으로 ConcMarkSweepGC는 강제로 작동하려고 할 때만 정상적으로 작동하며 세계 정지 및 (동시 모드 중단됨) 기록됩니다. 어떤 개체를 작은 GC로 청소할 수 있는지 그리고 어떤 개체가 내 프로그램에서 Full GC가 필요한지 파악하려고합니다. – user2618929

2

가비지 수집기는 메모리에서 개체를 제거하는 유일한 방법입니다. 원하는 때마다 System.gc()으로 전화 할 수 있습니다.이 때 가비지 수집기가 나중에는 아니고 빨리 실행되도록 요청합니다. 그러나 일반적으로, 필요가 없습니다. 프로그램에서 메모리 문제가 발생하기 전에 가비지 수집기가 자체적으로 실행됩니다.