자바 메모리 유출

4932 단어 Java메모리 유출
나 니,자 바 는 자동 으로 메모 리 를 관리 하지 않 습 니까?어떻게 메모리 유출 유출 유출 이 일어 날 수 있 습 니까?
자바 의 가장 강력 한 특징 중 하 나 는 쓰레기 수 거 메커니즘 이다.C++처럼 수 동 으로 메모 리 를 관리 하지 않 아 도 되 기 때문에 자바 프로그래머 로 서 행복 하 다.New New New 만 있 으 면 된다.어차피 자바 는 만 료 된 대상 을 자동 으로 회수 할 것 이다.
그러면 자바 가 자동 으로 메모 리 를 관리 하 는데 어떻게 메모리 누 출 이 발생 할 수 있 습 니까?혹시 Jvm 에 bug 가 있 습 니까?서 두 르 지 말고 내 가 천천히 말 하 는 것 을 들 어 라.
회수 가 가능 하 다 고 어떻게 판단 합 니까?
일단 Jvm 이 대상 을 어떻게 판단 하 는 지 알 아 보고 회수 할 수 있 습 니 다.일반적으로 두 가지 방식 이 있 는데 하 나 는 인용 계수 법 이 고 하 나 는 접근 성 분석 이다.
인용 계수 법:대상 마다 인용 계수 속성 이 있 습 니 다.인용 시 1 을 추가 하고 인용 방출 시 1 을 줄 이 며 0 으로 계산 하면 회수 할 수 있 습 니 다.
이 방법 은 보기 에는 매우 간단 해 보이 지만 A 가 B 를 인용 하고 B 가 A 를 인용 하면 이 때 는 그들 이 더 이상 사용 하지 않 더 라 도 서로 인용 계산기=1 은 영원히 회수 할 수 없 기 때문이다.
이 방법 은 간단 해서 대상 이 서로 순환 적 으로 인용 하 는 문 제 를 해결 할 수 없다.

접근 성 분석(Reachability Analysis):GC Roots 부터 아래로 검색 하고 지나 간 경 로 를 참조 체인 이 라 고 합 니 다.대상 이 GC Roots 에 인용 체인 이 연결 되 어 있 지 않 을 때 이 대상 이 사용 할 수 없다 는 것 을 증명 하면 가상 컴퓨터 는 회수 가능 대상 이 라 고 판단 합 니 다.

접근 성 분석 은 순환 인용 문 제 를 해결 할 수 있다.
그렇다면 gc roots 대상 은 무엇 일 까요?
가상 컴퓨터 스 택 에서 인용 한 대상방법 구역 에서 정적 속성 참조 대상방법 구역 에서 상수 인용 대상로 컬 방법 스 택 에서 JNI[즉,일반적으로 말 하 는 Native]가 인용 한 대상현재 주류 인 가상 머 신 에 서 는 대상 이 GC 에 회 수 될 수 있 는 지 를 판정 하기 위해 접근 성 분석 방식 을 많이 사용 하고 있다.
어떤 상황 에서 메모리 누 출 이 발생 합 니까?
가 달성 분석 이 이미 매우 강 한 것 같은 데 어떻게 메모리 누 출 이 발생 할 수 있 습 니까?그러면 메모리 누 출 의 정 의 를 다시 한번 살 펴 보 겠 습 니 다.
메모리 유출 은 프로그램 이 사용 하지 않 는 대상 이나 변수 가 메모리 에 계속 차지 되 는 것 을 말한다.
이 대상 이 사용 하지 않 을 수도 있 지만 다른 대상 이 이 대상 의 인용 을 유지 하고 있 으 면 GC 가 이 대상 을 회수 하지 못 할 경우 메모리 누 출 이 발생 할 수 있 습 니 다.
메모리 누 출 이 발생 하도록 프로그램 을 작성 하 다.
① 장수 주기 대상 이 짧 은 수명 주기 대상 의 인용 을 가지 고 있 으 면 메모리 유출 이 발생 할 수 있다.짧 은 수명 주기 대상 이 더 이상 필요 하지 않 지만 장수 주기 대상 이 그 인용 을 가지 고 있 기 때문에 회수 되 지 못 한다.

public class Simple {
 Object object;
 public void method1(){
 object = new Object();
 //...    
 }
}
이 곳 의 object 인 스 턴 스 는 사실 method 1()방법 에 만 사용 되 고 다른 곳 에 서 는 사용 되 지 않 기 를 바 랍 니 다.그러나 method 1()방법 이 실 행 된 후에 object 대상 이 분배 하 는 메모리 가 바로 방출 될 수 있 는 대상 으로 여 겨 지지 않 고 Simple 류 가 만 든 대상 이 방출 된 후에 만 방출 됩 니 다.엄 밀 히 말 하면...이것 이 바로 메모리 유출 이다.
해결 방법 은 object 를 method 1()방법의 국부 변수 로 하 는 것 이다.

public class Simple {
 Object object;
 public void method1(){
 object = new Object();
 //...    
 object = null;
 }
}
물론 이 방법 만으로 도 큰 영향 을 미 치지 않 을 것 이 라 고 생각 할 수도 있 지만,어떤 항목 에서 한 방법 이 1 분 안에 수만 번 을 호출 할 때 뚜렷 한 메모리 누 출 현상 이 나타난다.
② 집합 중의 메모리 유출,예 를 들 어 HashMap,Array List 등 은 이러한 대상 에 게 메모리 유출 이 자주 발생 한다.예 를 들 어 정적 대상 으로 밝 혀 졌 을 때 그들의 생명 주 기 는 응용 프로그램의 생명 주기 만큼 길 고 메모리 부족 을 초래 하기 쉽다.
집합 메모리 유출 에 대한 예 를 들 어 보 겠 습 니 다.

Vector v=new Vector(10);
for (int i=1;i<100; i++)
{
 Object o=new Object();
 v.add(o);
 o=null;
}
//  ,   Object        ,    v      。
이 예 에서 저 희 는 Object 대상 을 반복 적 으로 신청 하고 신청 한 대상 을 하나의 Vector 에 넣 습 니 다.만약 에 저희 가 인용 자체 만 방출 한다 면 Vector 는 이 대상 을 인용 하기 때문에 이 대상 은 GC 에 있어 서 회수 할 수 없습니다.
따라서 대상 이 Vector 에 가입 하면 Vector 에서 삭제 해 야 하 며,가장 쉬 운 방법 은 Vector 대상 을 null 로 설정 하 는 것 이다.
상기 두 가 지 는 가장 흔히 볼 수 있 는 메모리 누 출 사례 이다.물론 메모리 가 누 출 된 예 도 있 습 니 다.여 기 는 더 이상 일일이 예 를 들 지 않 고 관심 이 있 는 학생 들 은 인터넷 에서 자 료 를 찾 을 수 있 습 니 다.
메모리 누 출 과 메모리 넘 침
많은 학우 들 이 메모리 유출 과 메모리 유출 의 차 이 를 잘 모 르 는데,그 두 사람 은 완전히 다른 개념 으로,그들 사이 에 약간의 관련 이 존재 한다.
메모리 넘 침 out of memory 는 프로그램 이 메모 리 를 신청 할 때 사용 할 수 있 는 충분 한 메모리 공간 이 없고 out of memory 가 나타 나 는 것 을 말한다.
메모리 유출 memory leak 은 프로그램 이 메모 리 를 신청 한 후에 이미 신청 한 메모리 공간 을 방출 할 수 없 으 며,한 번 의 메모리 유출 위 해 는 무시 할 수 있 으 나,메모리 유출 축적 결 과 는 매우 심각 하 며,아무리 많은 메모리 가 있어 도 조만간 빛 을 볼 것 이다.
따라서 메모리 누 출 로 인해 메모리 가 넘 칠 수 있 지만 메모리 가 넘 치 는 것 은 모두 메모리 누 출 때 문 이 아니 라 너무 많은 대상 을 사 용 했 기 때 문 일 수도 있다.
어떻게 메모리 누 출 을 검사 합 니까?
마지막 으로 중요 한 문 제 는 자바 의 메모리 누 출 을 어떻게 검사 하 느 냐 하 는 것 이다.현재,우 리 는 보통 자바 프로그램의 메모리 누 출 문 제 를 검사 하기 위해 도 구 를 사용한다.
시장 에 자바 메모리 누 출 을 전문 적 으로 검사 하 는 몇 가지 도구 가 있 는데 그들의 기본 적 인 작업 원 리 는 대동소이 하 다.모두 자바 프로그램 이 실 행 될 때 모든 대상 의 신청,방출 등 동작 을 모니터링 하여 메모리 관리의 모든 정 보 를 통계,분석,시각 화 하 는 것 이다.개발 자 들 은 이 정보 에 따라 프로그램 에 메모리 누 출 문제 가 있 는 지 판단 할 것 이다.
이 도구 들 은 Plumbr,Eclipse Memory Analyzer,JProbe Profiler,JVisualVM 등 을 포함한다.
마지막.
이상 의 내용 은 제 가 자주 면접 을 본 내용 중 하나 입 니 다.일련의 문 제 를 통 해 자바 프로그래머 가 Jvm 에 대한 이 해 를 살 펴 보 았 습 니 다.
예 를 들 어 저 는 면접 자 에 게 자바 에 메모리 누 출 이 있 느 냐 고 물 어 봅 니 다.대부분의 사람들 이 존재 한다 고 대답 할 것 이다.이어서 나 는 프로그램 을 써 서 메모리 가 새 게 한다 면 어떻게 쓰 겠 느 냐 고 물 을 것 이다.대부분의 프로그래머 들 은 대답 하지 못 했다.
만약 에 면접 자가 위의 질문 에 대답 할 수 있다 면 저 는 이어서 면접 자 와 이 야 기 를 나 눌 것 입 니 다.메모리 누 출 과 메모리 가 넘 치 는 그들 사이 에 연락 이 있 는 지,그리고 일상적인 업무 에서 메모리 누 출 코드 를 쓰 는 것 을 어떻게 피 하 는 지,만약 에 Jvm 관련 문 제 를 생산 할 때 문제 의 사고 와 절 차 를 조사 할 것 입 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기