메모리 유출과 메모리 넘침은 어리석게 구분할 수 없나?간단하게 정리해 드릴게요!

3497 단어 Java 관련
메모리 유출과 메모리 넘침은 메모리를 합리적으로 사용할 수 없게 할 수 있지만 그 사이에 확실히 차이가 있어 헷갈리기 쉽다.
간단하게 말하면 메모리 유출은 살아남을 필요가 없는 대상이 메모리를 회수할 수 없는 것이다.메모리 넘침은 필요한 대상입니다. 메모리가 충분하지 않습니다.

메모리 유출


메모리 유출(memory leak): 프로그램이 메모리를 신청한 후 이미 신청한 메모리 공간을 방출하지 못하면 메모리 유출이 발생한다. 한 번의 메모리 유출은 큰 영향을 미치지 않을 것 같지만 메모리 유출이 쌓인 결과는 메모리 유출이다.

흔한 원인


한 대상이 회수되어야 할 것을 더 이상 사용할 필요가 없을 때, 다른 사용 중인 대상이 인용을 가지고 있어서 회수할 수 없게 되고, 회수되어야 할 대상이 회수되지 않고 메모리에 머무르게 되면 메모리 유출이 발생한다.
인코딩 문제로 인해 생명주기가 짧고 회수해야 할 대상이 gc에 의해 회수되지 못한다는 것이 제 이해입니다.

예를 들다


정적 클래스는 단일 모드를 실현합니다.적용되는 라이프 사이클만큼 긴 라이프 사이클이므로 단일 인스턴스를 작성할 때 다른 객체로 전달되면 객체를 회수할 수 없습니다.
/**
 *  , , 
 *
 * @author baijiaan
 * @date 2020-05-27
 */
public class SingleInstanceTest {

    private static SingleInstanceTest sInstance;
    private OneObject oneObject;

    private SingleInstanceTest(OneObject oneObject) {
        this.oneObject = oneObject;
    }

    public static SingleInstanceTest newInstance(OneObject oneObject) {
        if (sInstance == null) {
            sInstance = new SingleInstanceTest(oneObject);
        }
        return sInstance;
    }
}

메모리 오버플로우


메모리 오버플로우(out of memory): 프로그램이 메모리를 신청할 때 신청자가 사용할 충분한 메모리가 없거나 int 형식의 데이터를 저장할 수 있는 저장 공간을 주지만 롱 형식의 데이터를 저장하면 결과적으로 메모리가 충분하지 않다. 이때 OOM을 잘못 보고한다. 이른바 메모리 오버플로우다. 쉽게 말하면 우리가 가지고 있는 메모리보다 자신이 필요로 하는 공간이 크다.메모리 부족으로 인한 메모리 넘침

흔한 원인


메모리가 넘치는 원인은 비교적 광범위하다.
  • 할당된 메모리 자체가 부족할 수 있음
  • 메모리에 한 번에 너무 많은 데이터를 마운트
  • 메모리 유출로 인해 메모리가 불합리하게 사용되어 사용 가능한 메모리가 부족함
  • 인코딩 문제, 예를 들어 순환 창설 대상에 들어간 경우
  • 해결 방법


    위의 일반적인 원인에 대응하여 우리가 대략적인 해결 방향은 다음과 같다.
  • 수정 - Xmx
  • 과도한 데이터 일회성 로드 방지
  • OutOfMemory 이상을 찾아 문제의 발생 위치를 정한다
  • 좋은 인코딩 습관 기르기
  • 총결산


    개인은 메모리 유출은 일종의 행위이고 메모리 넘침은 결과라는 것을 이해한다.메모리가 넘쳐흐르면 시스템이 정상적으로 사용할 수 없습니다.간혹 메모리 유출은 무섭지 않고 빈번한 메모리 유출은 나쁜 결과를 초래할 수 있다.

    좋은 웹페이지 즐겨찾기