static
이거 정처기 문제에 대표적으로 나오는 내용
public static int value = 0
a = new StaticEx();
a.value++;
b = new StaticEx();
b.value++;
c = new StaticEx();
c.value++;
print(a, b, c) // 3, 3, 3
// 서로 다른 객체를 생성했지만 최종적으로 static 값은 3이므로
static 초기화 블록
static {
staticVal = "Value";
staticVal = StaticEx.staticInt;
}
- 자주 사용하고 절대 변하지 않는 변수는 final static으로 선언하자
- 설정 파일 정보도 static으로 관리하자
- 코드성 데이터는 DB에서 한 번만 읽자
Static 주의해야 하는 상황
public class BadQueryManager {
private static String queryURL = null;
public BadQueryManager(String badUrl) {
queryURL = badUrl;
}
public static String getSql(String idSql) {
HashMap<String, String> document = read.read(queryURL);
...
}
}
- queryURL을 static으로 선언했기 때문에 모든 스레드에서 최종적으로 동일한 주소를 가리키게 되어 문제가 발생함
priavte static boolean successFlag;
- true인 상황에서 누군가 false 요청을 보내면 완전히 다른 결과를 반환함
static과 메모리 leak
- static으로 선언한 부분은 GC가 되지 않는다
- 만약 클래스에 데이터를 담을 때 Collection 객체를 static으로 선언하면
지속적으로 데이터가 쌓이게 되고
더이상 GC가 되지 않으면서 시스템은 OutOfMemoryError를 발생 시키며 토해낸다. - 서버를 재가동 해야 하는 문제가 된다
- HeapDump라는 파일을 통해 확인 가능
reflection
- 자세한 메서드들은 잘 찾아보도록 하자
Class 클래스
- 클래스에 대한 정보를 얻을 때 사용하기 좋다
- Object 클래스에 있는 getClass() 메서드를 이용하는 것이 일반적이다
- 변수 목록을 Field 클래스 타입으로 받아온다
- 선언된 메서드들을 적절히 가져온다
- 선언된 생성자 정보를 적절히 가져온다
Method 클래스
- Class 클래스의 getMethods() 메서드를 사용하거나 getDeclaredMethod() 메서드를 써야한다
- 해당 메서드에 관한 각종 정보들을 리턴함
Field 클래스
- Class 클래스의 getField() 메서드나 getDeclaredFields() 메서드를 써야함
- 변수 관련 정보를 제공한다
잘못된 사례
src.getClass().getName().equals("")
- reflection에 꽂혀서 단편적으로 생각 말자 (1.022초)
src instanceof ...
- 이게 있다 (0.167초)
중요!!! 이거부터 볼 것
클래스의 메타 데이터 정보는 JVM의 Perm 영역에 저장된다
JDK 8부터는 PermGen이라는 영역이 제거되고
Metaspace라는 영역이 Native Memory에 추가됌
즉, Static 변수는 Heap영역으로 옮겨져서 GC의 대상이 되었음!!
나머지 수정이 될 일 없어보이는 정보는 Native로 옮겨짐!!
Java - Perm 영역이 Metaspace로 바뀐 이유! [+ Heap Area, Native Memory 차이]
JDK 8부터는 Java Heap에서 PermGen이라는 영역이 제거되었고, Metaspace라는 영역이 Native Memory에 추가되었다. 기존에 Perm 영역 크기로 인한 java.lang.OutOfMemory가 뜨는 경우가 많았다. PermGen이라는 영역이
jaehoney.tistory.com
JDK 8에서 Perm 영역은 왜 삭제됐을까
johngrib.github.io
'개발서적 > 자바 성능 튜닝 이야기' 카테고리의 다른 글
[자성튜이] 로그 작성 (0) | 2024.09.16 |
---|---|
[자성튜이] IO 이야이야기 (0) | 2024.08.25 |
[자성튜이] String을 자제해라 / for문을 더 빠르게?? (0) | 2024.08.22 |
[자성튜이] 속도 측정 (0) | 2024.08.22 |
[자성튜이] J2EE 디자인 패턴 (0) | 2024.08.22 |