2013-10-29 2 views
1

다음 명령문을 고려하고 로그 수준을 ERROR로 설정하십시오. 사용중인 로깅 API는 log4j입니다. 위의 정보에 따라 몇 개의 문자열이 생성됩니까?상수 풀에서 얼마나 많은 문자열 객체가 생성됩니까?

if (logger.isDebugEnabled()) { 
    logger.debug("Executing SQL query [" + sql + "]"); 
} 

다른 문제는 위의 경우에 생성됩니다 얼마나 많은 문자열

if (logger.isDebugEnabled()) { 
    StringBuilder sBuilder = new StringBuilder("Executing SQL query ["); 
    sBuilder.append(sql); 
    sBuilder.append("]"); 
    logger.debug(sBuilder.toString()); 
} 

입니까?

로거가 디버그를 사용할 수 없어도 내 질문에 컴파일러가 문자열을 만들 것입니까?

답변

2
logger.debug("Executing SQL query [" + sql + "]"); 

두 문자열을 컴파일시에 생성

"Executing SQL query [" 

"]" 

. 힙 메모리에 새로운 String 인스턴스를 생성 런타임에서 다음

그리고

, 새의 StringBuilder (문자열을 ...) 반환 JVM

"Executing SQL query [" + sql + "]" 

(+) 연산자를 사용합니다. toString().

디버그가 사용 가능한 경우 추가 작업이 StringBuilder.toString과 함께 발생합니다.

+0

런타임에도로드됩니까? – Jabir

+0

@Jabir Ofcourse, 그건 단순한 자바 라인, 날씨 그것은 로거 또는 무엇인지. 적어도 나는 그렇게 믿는다. –

+0

@Suresh 약간의 질문을 수정했습니다. 지금 바로 확인하십시오. – Jabir

2

소스 코드에 따옴표가 있으면 컴파일러는 코드가 아무리 복잡해도 문자열 상수를 풀에 넣습니다. 컴파일러는 코드가 도달 할 수 없음을 명확하게 볼 수있는 경우를 제외하고는 많은 가정을하지 않습니다 (예 : if(false)).

당신은 런타임에, 그것은 여전히 ​​StringBuilder을 만들고 패턴 및 인수의 결과를 구축하지만, SLF4J 것이다 것

log.debug("Executing SQL query [{}]", sql); 

노트를 작성할 수 있습니다 logback와 SLF4J를 보라 할 수 있습니다 if을 해보십시오. 그렇게하면 많은 노력을하지 않아도 코드를 빠르고 깨끗하게 유지할 수 있습니다.

project Lombok과 그 @Log annotation을 보면 더 쉽고 간편해질 수 있습니다.

관련 문제