728x90
반응형
자바에서 특정 key에 대한 value로 list를 지정하여 해당 key에 대하여 값들을 모아두는 형태로 코드를 작성하는 경우가 있습니다.
Map<String, List<String>> map = new HashMap<>();
이런 경우 GC가 발생하게 된다면 어떻게 될까요?
값들을 저장해서 계속 사용한다면 괜찮겠지만, 이렇게 만들어두고 값을 전달한 후, 더이상 사용하지 않는 경우에서 gc가 발생할 경우?
이런 형태로 해당 값이 사용중인지 확인하는 단계를 거치게 될 것입니다.
'그치만 값 전달 후 map.clear()를 통해 map을 비워버리면? gc는 해당 map이 바로 사용하지 않는 상태라는 것을 확인하여 지우는데 오랜 시간이 걸리지 않을까?' 라는 생각을 하게 되었습니다.
map.clear()를 하면 gc가 발동하기 전 실제 프로그램 속도에 영향이 더 끼치는거 아니야?
라는 반대 의견에 대응하기 위하여 테스트를 해봤습니다.
직접 GC가 발동될때까지 메모리를 저장할 수 없어, System.gc()를 활용하여 직접 gc를 발동해 테스트를 진행하였습니다.
- clear를 하지 않은 경우
long beforeTime = System.currentTimeMillis(); //코드 실행 전에 시간 받아오기
Map<String, List<String>> map = new HashMap<>();
List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
for(int i = 0; i < 10000000; i++) {
map.put(String.valueOf(i), list);
}
long afterTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기
long secDiffTime = afterTime - beforeTime; //두 시간에 차 계산
System.out.println("시간차이(ms) : "+secDiffTime);
beforeTime = System.currentTimeMillis(); //코드 실행 전에 시간 받아오기
System.gc();
afterTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기
secDiffTime = afterTime - beforeTime; //두 시간에 차 계산
System.out.println("시간차이(ms) : "+secDiffTime);
결과
시간차이(ms) : 916
시간차이(ms) : 290
- map.clear()를 사용하는 경우
long beforeTime = System.currentTimeMillis(); //코드 실행 전에 시간 받아오기
Map<String, List<String>> map = new HashMap<>();
List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
for(int i = 0; i < 10000000; i++) {
map.put(String.valueOf(i), list);
}
map.clear();
long afterTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기
long secDiffTime = afterTime - beforeTime; //두 시간에 차 계산
System.out.println("시간차이(ms) : "+secDiffTime);
beforeTime = System.currentTimeMillis(); //코드 실행 전에 시간 받아오기
System.gc();
afterTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기
secDiffTime = afterTime - beforeTime; //두 시간에 차 계산
System.out.println("시간차이(ms) : "+secDiffTime);
결론
시간차이(ms) : 939
시간차이(ms) : 13
- 실험 결론
- 프로그램이 작동하는데 map.clear()를 사용해 약간의 시간이 더 소요하게 됨
- 그러나, gc 발동 시 시간은 확연하게 차이가 날 정도로 적게 소요하게 된다.
- 사용하지 않는 변수의 경우 clear()를 통해 비워주면 좋을 것같다
여기서 clear()관련 이슈가 발생합니다.
https://www.acmicpc.net/board/view/90885
이전 제가 백준을 통해 냈던 문제 관련해서 저격 소스 중, clear()에 대해 나온 글이 있습니다.
이를 토대로 테스트해본 결과, clear()를 통해 초기화 보다는 null이나 재선언 방식으로 할당하는 게, 시간이 더 적게 소요된다는 것을 발견하였습니다.
HashMap<String List<String>> map = new HashMap<>();
map = null;
map = new HashMap<>();
728x90
반응형
'잡담 > 궁금증 해결' 카테고리의 다른 글
jar 파일에 한글 입력하기 (feat. PHP, JAVA) (0) | 2024.09.09 |
---|---|
시간 측정 테스트시 주의할 점 (0) | 2024.09.02 |
heap vs TreeMap<key, list> (0) | 2024.05.19 |
변수 선언 후 인자 전달 vs 인자 전달 (0) | 2024.02.14 |
비트연산 과연 더 빠른가? (0) | 2023.02.28 |
댓글