를 강제로 때까지 메모리에 보관 :개체 나 같은 코드를 가지고 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"가 전체 가비지 수집기가 될 때까지 메모리에 남아 있습니다. 가비지 컬렉터가 프로그램의 모든 객체에 액세스 할 수 있는지 확인하기 위해 대기하지 않고 해당 객체를 실시간으로 제거 할 수있는 방법이 있습니까?
이 코드에서 시작된 스레드가 없습니다. – njzk2
척 노리스 만 청소기를 강제로 청소할 수 있습니다! –
1. Java가 실행될 필요가있을 때 GC가 실행됩니다. 2. Java는 GC 실행시기를 결정할 때 당신보다 훨씬 똑똑합니다. –