자바 의 -- 메모리 넘 침 사례

3680 단어 JAVAJVMJava
전재 출처 를 밝 혀 주 십시오:http://blog.csdn.net/l1028386804/article/details/78024608
오늘 은 자바 메모리 가 넘 치 는 글 을 보 내 드 리 겠 습 니 다. 자, 더 이상 말 하지 않 겠 습 니 다. 우 리 는 바로 주제 에 들 어 갑 니 다.
1. 주요 구조 정의
우선, 우 리 는 BlowUpJVM 이라는 종 류 를 만 들 었 고 모든 사례 실험 은 이런 종 류 를 바탕 으로 진행 되 었 다.
public class BlowUpJVM {  
} 

2. 스 택 깊이 넘 침
public static void  testStackOverFlow(){ 
      BlowUpJVM.testStackOverFlow(); 
} 
스 택 이 계속 돌아 오고 처리 하지 않 았 기 때문에 가상 컴퓨터 스 택 은 계속 깊이 들 어가 고 스 택 의 깊이 는 이렇게 넘 쳤 다.
3. 영구 세대 메모리 넘 침
public static void testPergemOutOfMemory1(){ 
   //      
    List list = new ArrayList(); 
 
   while(true){ 
      list.add(UUID.randomUUID().toString().intern()); 
   } 
} 
String 상수 탱크 를 가득 채 우려 고 했 는데 실패 할 줄 은 몰 랐 습 니 다. JDK 1.7 후 상수 탱크 를 더미 에 넣 어도 쓰레기 수 거 를 할 수 있 습 니 다.
그리고 다른 방식 으로 cglib 를 사용 하여 Class 로 오래된 연 대 를 가득 채 웁 니 다.
public static void testPergemOutOfMemory2(){ 
   try { 
      while (true) { 
         Enhancer enhancer = new Enhancer(); 
         enhancer.setSuperclass(OOM.class); 
         enhancer.setUseCache(false); 
         enhancer.setCallback(new MethodInterceptor() { 
            @Override 
            public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { 
               return proxy.invokeSuper(obj, args); 
            } 
         }); 
         enhancer.create(); 
      } 
   } 
   catch (Exception e){ 
      e.printStackTrace(); 
   } 
} 
가상 컴퓨터 가 성공 적 으로 메모리 가 넘 쳤 습 니 다. 그러면 JDK 동적 에이전트 가 발생 하 는 클래스 가 넘 칠 수 있 습 니까?
public static void testPergemOutOfMemory3(){ 
   while(true){ 
   final OOM oom = new OOM(); 
   Proxy.newProxyInstance(oom.getClass().getClassLoader(), oom.getClass().getInterfaces(), new InvocationHandler() { 
         public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 
            Object result = method.invoke(oom, args); 
            return result; 
         } 
      }); 
   } 
} 
사실 에 따 르 면 JDK 동적 에이전트 열등생 의 클래스 는 메모리 가 넘 치지 않 습 니 다. 그 이 유 는 JDK 동적 에이전트 가 발생 하 는 클래스 정 보 는 영구적 인 세대 에 넣 지 않 고 쌓 여 있 기 때 문 입 니 다.
4. 로 컬 방법 스 택 넘 침
public static void testNativeMethodOutOfMemory(){ 
   int j = 0; 
   while(true){ 
      Printer.println(j++); 
      ExecutorService executors = Executors.newFixedThreadPool(50); 
      int i=0; 
      while(i++<10){ 
         executors.submit(new Runnable() { 
            public void run() { 
            } 
         }); 
      } 
   } 
} 
이 원 리 는 스 레 드 풀 을 계속 만 드 는 것 이다. 모든 스 레 드 풀 은 10 개의 스 레 드 를 만 드 는 것 이다. 이런 스 레 드 풀 은 모두 현지 방법 구역 에 있 고 시간 이 지나 면 현지 방법 구역 이 넘 쳐 난다.
5. JVM 스 택 메모리 넘 침
public static void testStackOutOfMemory(){ 
    while (true) {   
            Thread thread = new Thread(new Runnable() {   
                   public void run() { 
                          while(true){ 
                      } 
                   }   
            });   
            thread.start();   
     }   
} 
스 레 드 의 생 성 은 JVM 스 택 에서 직접 생 성 됩 니 다. 그러나 이 예 에서 메모리 가 넘 치 는 것 을 보지 못 했 습 니 다. 호스트 가 먼저 끊 었 습 니 다. JVM 이 끊 은 것 이 아니 라 정말 호스트 가 끊 었 습 니 다. mac 에서 든 windows 에서 든 모두 끊 었 습 니 다.
따뜻 한 힌트, 이거 진짜 죽 어.
6. 넘 침
public static void testOutOfHeapMemory(){ 
   List list = new ArrayList(); 
   while(true){ 
      StringBuffer B = new StringBuffer(); 
      for(int i = 0 ; i < 10000 ; i++){ 
         B.append(i); 
      } 
      list.add(B); 
   } 
} 
새로 추 가 된 StringBuffer 대상 을 계속 쌓 아 올 리 면 바로 넘 칩 니 다.

좋은 웹페이지 즐겨찾기