자바 성능 튜닝 이야기 로그
알아보게 된 이유.
자바 성능 튜닝 이야기라는 책을 읽으며 자바의 성능을 올릴 수 있는 이야기들을 정리해보고 자 한다.
로그는 반드시 필요한 내용만 찍자
System.out.println()의 문제점
대부분 로그를 찍기 위해 System.out.println()메서드를 사용한 시스템 로그를 많이 사용. 해당 방법은 커널 CPU의 사용량이 높아 성능에 영향.
파일이나 콘솔에 로그를 남길때 내용이 완전히 프린트되거나 저장이 될때 까지 뒤에 프린트 하려는 부분은 대기가 되어지기때문에 대기시간이 발생. 로그 출력은 개발할 때만 사용하므로 운영할 때 println()은 성능에 무리를 주게 된다.
System.out.format()은 C언어 처럼 프린트 할 수 있으므로 소스를 간결하게 처리할 수 있다. String.format은 컴파일시 변환된 부분을 보면 새로운 Object를 생성하여 표현할 값을 배열에 포함시키게 하고 Long값의 경우에는 valueOf()메서드를 사용해 Object형태로 나타내므로 성능면에서 좋지 않다. %가 들어가있는 format 문자열을 항상 파싱하기 때문에 성능에서 좋지 않다.
로그를 출력할 시 로거를 이용하거나 로거 사용이 힘들때 시스템 로그를 컴파일할때 삭제 하도록 하는 것이 좋다. private final boolean printFlag 라는 변수를 생성해 시스템 로그 부분을 if로 감싼다. 이 방법 이용시 여러군대서 사용할 경우 모두 변경해 주어야 하기 때문에 별도의 클래스를 생성하여 사용하는것이 좋다. if를 감싸는 것도 개별 클래스에 넣어서 메시지를 매개변수로 받아 출력하면 편리.’ 하지만 이 방법은 printFlag를 수정하기 위해 다시 컴파일 해야 하는 단점.
로그를 사용하기 위해선 객체를 생성하게 되고 그 객체를 생성하는데 메모리와 시간이 소요되고 메모리에서 제거하기 위해 GC를 수행하고 시간이 소모 된다.
그러므로 가장 좋은 방법은 디버그용 로그를 제거하는 것이 좋다.
slf4j는 로그를 출력을 할때만 문자열을 더해주므로 필요없는 연산이 발생하지 않는다.