2.4 실전:OutOfmory 오류 이상(일부 상황 코드 세그먼트)

2.4.1 자바 더미 넘 침
  • 코드 는 자바 더미 의 크기 를 20MB 로 제한 하고 확장 할 수 없습니다.
    /**
     * VM Args:-Xms20m-Xmx20m-XX:+HeapDumpOnOutOfMemoryError
     */
    public class HeapOOM {
        static class OOMObject {
        }
    
        public static void main(String[] args) {
            List list = new ArrayList<>();
            while (true) {
                list.add(new OOMObject());
            }
        }
    }
    

    실행 결과;java.lang.OutOfMemoryError:Java heap space Dumping heap to java_pid3404.hprof…… Heap dump file created[22045981 bytes in 0.663 secs]
    메모리 유출 인지 메모리 유출 인지 구분 하 세 요.
    4.567917.메모리 누 출:프로그램 이 메모 리 를 신청 한 후에 이미 신청 한 메모리 공간 을 방출 할 수 없다 는 것 을 말한다.한 번 의 메모리 누 출 위 해 는 무시 할 수 있 지만 메모리 누 출 축적 결 과 는 매우 심각 하 다.아무리 메모리 가 많아 도 조만간 빛 을 차지 할 것 이다
  • 4.567917.메모리 넘 침:분 배 를 요구 하 는 메모리 가 시스템 이 줄 수 있 는 것 을 초과 하고 시스템 이 수 요 를 만족 시 키 지 못 해서 넘 침 이 발생 합 니 다
    2.4.2 가상 컴퓨터 스 택 과 로 컬 방법 스 택 넘 침
    가상 컴퓨터 스 택 과 로 컬 방법 스 택 OOM 테스트
    /**
     * VM Args:-Xss128k *@author zzm
     */
    public class JavaVMStackSOF {
        private int stackLength = 1;
    
        public void stackLeak() {
            stackLength++;
            stackLeak();
        }
    
        public static void main(String[] args) throws Throwable {
            JavaVMStackSOF oom = new JavaVMStackSOF();
            try {
                oom.stackLeak();
            } catch (Throwable e) {
                System.out.println("stack length:" + oom.stackLength);
                throw e;
            }
        }
    }
    

    4.567917.스 레 드 를 만 들 면 메모리 가 넘 치 는 이상 이 발생 합 니 다.끊임없이 스 레 드 를 만 드 는 방식 으로 메모리 가 넘 치 는 이상 이 발생 할 수 있 습 니 다
    /**
     * VM Args:-Xss2M(         ) *@author zzm
     */
    public class JavaVMStackOOM {
        private void dontStop() {
            while (true) {
            }
        }
    
        public void stackLeakByThread() {
            while (true) {
                Thread thread = new Thread(new Runnable() {
                    @Override
                    public void run() {
                        dontStop();
                    }
                });
                thread.start();
            }
        }
    
        public static void main(String[] args) throws Throwable {
            JavaVMStackOOM oom = new JavaVMStackOOM();
            oom.stackLeakByThread();
        }
    }
    

    2.4.3 방법 구역 과 운행 시 상 당량 탱크 넘 침
    /**
    *  JDK 1.6       ,             ,      -XX:PermSize -XX:MaxPermSize        ,              
     * VM Args:-XX:PermSize=10M-XX:MaxPermSize=10M
     */
    public class RuntimeConstantPoolOOM {
        public static void main(String[] args) {
            //  List        ,  Full GC      
            List list = new ArrayList<>();
            //10MB PermSize integer       OOM 
            int i = 0;
            while (true) {
                list.add(String.valueOf(i++).intern());
            }
        }
    }  
    

    2.4.4 이 컴퓨터 의 직접 메모리 가 넘 칩 니 다.

    좋은 웹페이지 즐겨찾기