자바 코드 최적화 - 만 료 된 대상 참조 제거
자바 의 쓰레기 회수 메커니즘
자바 의 대상 은 더미 에서 분 배 됩 니 다. 대상 의 생 성 은 2 가지 방식 이 있 습 니 다: new 또는 반사.대상 의 수 거 는 쓰레기 수집 기 를 통 해 JVM 의 쓰레기 수집 기 는 프로그래머 의 작업 을 간소화 하 였 으 나 JVM 의 작업 을 가중 시 켰 다. 이것 은 자바 프로그램의 운행 이 약간 느 린 원인 중 하나 이다. 왜냐하면 GC 는 대상 을 정확하게 방출 하기 위해 모든 대상 의 운행 상 태 를 감시 해 야 하기 때문이다. 대상 의 신청, 인용, 인용, 할당 등 을 포함 하여 GC 는 모두 감 시 를 해 야 하기 때문이다.감시 대상 의 상 태 는 대상 을 더욱 정확 하고 신속하게 석방 하기 위 한 것 이 고 대상 을 석방 하 는 근본 적 인 원칙 은 이 대상 이 더 이상 인용 되 지 않 는 다 는 것 이다.
3. 자바 의 메모리 유출
메모리 유출 대상 은 다음 과 같은 두 가지 특징 이 있 습 니 다.
① 이런 대상 은 도달 할 수 있다. 즉, 그림 에 통로 가 존재 하면 연결 할 수 있다.② 이 대상 들 은 쓸모 가 없다. 즉, 프로그램 이 다 시 는 이 대상 을 사용 하지 않 는 다 는 것 이다.
public class Stack {
private final static int MAX_ATTRIBUTE = 10;
private Object[] arr;
private int index = 0;
public void push(Object obj) {
if (index > 9)
throw new IllegalArgumentException();
arr[index] = obj;
index++;
}
public Stack() {
arr = new Object[MAX_ATTRIBUTE];
}
public Object pop() {
if (index < 0)
throw new IllegalArgumentException();
return arr[--index];
}
}
이 프로그램 에서 메모리 유출 이 발생 했 습 니까?스 택 이 먼저 늘 어 나 고 줄 어 들 면 스 택 에서 튀 어 나 온 대상 은 쓰레기 로 회수 되 지 않 습 니 다. 스 택 을 사용 하 는 프로그램 이 이 대상 을 더 이상 인용 하지 않 더 라 도 회수 되 지 않 습 니 다. 스 택 내부 에서 이 대상 에 대한 만 료 참조 가 유지 되 기 때 문 입 니 다.
public Object pop() {
if (size == 0)
throw new EmptyStackException();
Object result = elements[--size];
elements[size] = null; //Eliminate obsolete reference
return result;
}
해결 방법: 하나의 요소 가 스 택 에서 꺼 지면 인용 을 비 워 두 면 GC 는 회수 합 니 다.즉, 배열 요소 가 비 활동 적 인 부분의 일부분 이 되면 이 배열 요 소 를 손 으로 비 우 는 것 이다.
유사 한 문제 에 시 달리 지 마라
프로그래머 가 이런 문제 에 처음 시 달 렸 을 때 그들 은 지나치게 조심 하 는 경우 가 많다.모든 대상 의 인용 에 대해 서 는 더 이상 사용 하지 않 으 면 비 워 두 는 것 은 불필요 하 다. 그러면 오히려 코드 를 혼 란 스 럽 게 할 수 있다.삭제 대상 의 인용 은 규범 적 인 행위 가 아니 라 예외 여야 한다.만 료 된 인용 을 없 애 는 가장 좋 은 방법 은 이 인용 을 포함 하 는 변 수 를 수명 주 기 를 끝 내 는 것 이다.가장 치밀 한 역할 영역 범위 내 에서 모든 변 수 를 정의 한다 면 이런 상황 은 자 연 스 럽 게 발생 할 것 이다.일반적으로 클래스 가 스스로 메모 리 를 관리 하 는 것 이 라면 메모리 누 출 문 제 를 경계해 야 한다.요소 가 풀 리 면 이 요소 에 포 함 된 모든 대상 참조 가 비 워 져 야 합 니 다.
4. 흔히 볼 수 있 는 메모리 유출
① 캐 시.대상 을 캐 시 에 인용 하면 잊 혀 지기 쉬 워 서 더 이상 사용 하지 않 고 오 랜 시간 동안 캐 시 에 남아 있 습 니 다.② 자바 프로그램 에서 우 리 는 모니터 와 자주 접촉 해 야 한다. 보통 addXXXListener () 와 같은 방법 으로 모니터 를 추가 하지만 이 모니터 를 삭제 하 는 것 을 잊 어 버 려 메모리 누 출 기 회 를 증가 시킨다.③ 연결 풀 을 사용 할 때 연결 을 명시 적 으로 닫 는 것 외 에 Resultset 과 Statement 대상 을 명시 적 으로 닫 아야 합 니 다.그렇지 않 으 면 대량의 대상 이 방출 되 지 못 해 메모리 유출 을 일 으 킬 수 있다.④ 정적 변 수 를 최대한 적 게 사용 합 니 다. 정적 변 수 는 영구적 인 세대 에 저장 되 기 때문에 영구적 으로 쓰레기 회수 에 참여 하지 않 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.