티스토리 뷰
JVM
jvm은 OS로부터 java application이 필요로 하는 메모리 영역을 할당 받음.
해당 메모리 영역을 효율적으로 사용하기 위해서 관리하는 역할 수행.
메모리 관리 시 Garbage Collection을 수행.
(OS로부터 할당받은 메모리 영역 = Runtime Data Area)
Garbage Collection (GC)
Runtime Data Area 중 Heap 메모리 영역에 사용하지 않는 자원을 메모리에서 삭제 하는 작업. (자원=객체)
Heap 영역 구조
-
Yong Generation 영역 : 생명주기가 짧은 객체 존재 세부적으로 아래 두 영역으로 구분
-
Eden : 객체가 최초 생성되면 보관되는 영역
-
Supervisor(from, to) : MinorGC 시 Eden 영역과 함께 비교되어 사용되는 영역
-
-
Old Generation : 생명주기가 긴 객체 존재 (GC 되지 않고 오랫동안 살아남은 객체)
-
Permanent Generation : java application을 실행할때 클래스와 메타데이터를 저장하는 영역 (java 8부터는 MetaSpcae 영역으로 대체)
GC 종류
-
minor GC
-
heap 영역 중 young 영역에서 수행하는 GC.
-
-
최초 객체 생성 시 Eden 영역에 적재
-
Eden 영역을 어느정도 사용하여 GC 발생 시 비어있는 Supervisor 영역(from)으로 이동
-
Supervisor 영역(from)에 계속 적재가 되어 더 이상 적재가 불가능할 때 GC 발생 이때는 Eden 영역과 Supervisor 영역(from)에 객체를 다른 Supervisor 영역(to)에 적재
-
이러한 과정(1~3)을 반복해서 계속 살아 남은 객체는 old 영역으로 이동
-
major GC
-
heap 영역 중 old 영역에서 수행하는 GC
-
minor GC 실패시 수행
-
GC 알고리즘에 따라서 방법 다르지만 객체의 생사 여부를 체크(객체 참조 여부)하여 죽은 객체들은 삭제 처리. (Mark and Sweep)
-
-
Full GC
-
minor GC와 major GC 모두 더 이상 수행이 불가한 경우 발생하는 GC
-
young 영역과 old 영역 모두 GC 처리.
-
Full GC가 수행되는 경우 application Thread는 멈추게 됨.(Stop and World)
-
GC 대상
-
객체 참조가 null 인 경우
-
객체가 블럭 내에서 생성되고 해당 블럭이 종료되었을 경우
-
부모 객체가 null이 된 경우, 자식 및 포함된 객체
-
약한 참조(Weak Reference)만 가지고 있는 경우
JAVA 메모리 누수 방지 코딩
-
객체 사용 후 null 할당
1
2
3
4
5
6
7
8
9
|
//객체 생성
List<Object> list = new ArrayList<Object>();
//list 객체 사용
...
//객체 사용 완료 후 null 부여
list = null;
|
cs |
-
String 객체 대신 StringBuffer 대체 사용
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
/*
String 객체 += 연산자 사용시
100개의 String 객체가 생성됨
*/
String str = "test";
for(int i =0; i<100; i++){
str += ".";
}
//=======================================
/*
StringBuffer 사용 시
하나의 StringBuffer 객체에 작업 수행
*/
StringBuffer strBf = new StringBuffer();
strBf.append("test");
for(int i =0; i<100; i++){
strBf.append(".");
}
|
cs |
-
자원 반납
1
2
3
4
5
6
7
8
9
10
11
12
13
|
FileInputStream fis = null;
try{
fis = new FileInputStream("");
}catch(IOException e){
}finally {
try {
fis.close(); // 자원 사용 후 반납 ★★★★★
}catch (IOException ie){
}
}
|
cs |
-
static 변수 사용 최소
-
static 변수는 메모리 영역 중 static 영역에 생성되어 GC관리 영역을 벗어남.
-
static 변수는 프로그램이 종료될 때 해제됨.
-
마치며
Full GC 발생 시 application Thread 작업이 중단이 되어 application 성능 저하의 원인이 되기 때문에 GC 발생 빈도를 줄이는 코딩 습관과 적절한 GC 방식 선택이 필요.
'JAVA' 카테고리의 다른 글
[JAVA] javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure (2) (0) | 2021.07.08 |
---|---|
[java] javax.net.ssl.SSLHandshakeException : Received fatal alert : handshake_failure (0) | 2021.06.08 |
[java] API 호출 안되는 현상 해결 (301 응답코드) (1) | 2020.12.07 |
[java] SSLException: Received fatal alert: protocol_version 에러 해결 (0) | 2020.08.15 |
[java] HttpUrlConnection 안전하게 사용하기 (0) | 2020.08.02 |
- Total
- Today
- Yesterday
- html
- Linux
- Git
- SSL
- Windows
- JSON
- vscode
- gradle
- JPA
- 날짜
- btye
- SQL
- React
- mybatis
- Eclipse
- docker
- jQuery
- spring
- 깨짐
- parse
- SpringBoot
- IMAGE
- web
- Oracle
- Java
- TLS
- 이벤트발생
- jaxen
- 컨테이너
- WAS
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |