2014-11-12 2 views
2

프로그래밍 방식으로 처리 할 수 ​​있습니까? 여기java.lang.OutOfMemory 예외를 예측하는 방법은 무엇입니까?

내가 무엇을 시도했다입니다 :

import java.util.ArrayList; 
import java.util.List; 

public class TestMemory { 

    public static void main(String[] args) { 

     int kb = 1024; 

     //Getting the runtime reference from system 
     Runtime runtime = Runtime.getRuntime(); 

     //Print used memory 
     System.out.println("Used Memory:" + (runtime.totalMemory() - runtime.freeMemory())/kb); 

     //Print free memory 
     System.out.println("Free Memory:" + runtime.freeMemory()/kb); 

     //Print total available memory 
     System.out.println("Total Memory:" + runtime.totalMemory()/kb); 

     //Print Maximum available memory 
     System.out.println("Max Memory:" + runtime.maxMemory()/kb); 

     List<String> list = new ArrayList<>(); 
     for (int i = 0; i < 10000; i++) { 
      for (int j = 0; j < 1000; j++) { 
       list.add("abcdefghij" + i + j); 
      } 
      if (i % 1000 == 0) { 
       try { 
        Thread.sleep(500); 
        System.out.println("Free Memory:" + runtime.freeMemory()/kb + " Kb"); 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 
} 

및 출력 :

Used Memory:289 
Free Memory:15582 
Total Memory:15872 
Max Memory:126720 
Free Memory:15405 Kb 
Free Memory:22820 Kb (long pause, longer than 500ms and then exception) 
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 
    at java.util.Arrays.copyOfRange(Arrays.java:2694) 
    at java.lang.String.<init>(String.java:203) 
    at java.lang.StringBuilder.toString(StringBuilder.java:405) 
    at TestMemory.main(TestMemory.java:32) 

그것은 나에게 많은에게 말을하지 않습니다. 나는 "Free Memory"값이 충돌 이전에 감소 할 것으로 기대한다. 사용 가능한 메모리를 확인하고이 예외가 발생하기 전에 메모리 양을 알려주는주기를 작성하는 방법은 무엇입니까?

+0

실제로 무엇을하려고합니까? 그냥 메모리를 채우는 것은 나에게 진짜 유스 케이스처럼 들리지 않는다. –

답변

1

나는 if (i % 100 == 0) {

에 선 if (i % 1000 == 0) {을 변경했습니다 그리고 출력은 변경 :이 프로그램은 단지 감소를 보여 충분한 시간을 가지고

Free Memory:73604 Kb 
Free Memory:66637 Kb 
Free Memory:54902 Kb 
Free Memory:51044 Kb 
Free Memory:44013 Kb 
Free Memory:36982 Kb 
Free Memory:27633 Kb 
Free Memory:20661 Kb 
Free Memory:13691 Kb 
Free Memory:4352 Kb 
Free Memory:54 Kb 

.

0

메모리가 부족할 때 힙을 잡을 catch 문을 추가한다고 말하고 싶습니다. 호출하는 메소드는 프로그램을 실행할 때 힙 공간에 할당 된 것이 아니라 시스템에 얼마나 많은 메모리가 있는지를 반환합니다. JVM은 메모리를 자체적으로 할당하지만 C와 같은 언어는 malloc()을 호출해야이 작업을 수행 할 수 있습니다.

+0

나는이 예외를 잡을 수 없었다. 프로그램은 그것이 버려진 후에 즉시 멈 춥니 다. – ka3ak

1

OutOfMemoryException을 피하기 위해 자신의 프로그램을 관리하는 것이 좋은 방법이라고 생각하지 않습니다. 메모리의 필요에 맞게 힙 앞에 크기를 지정해야합니다. 어쨌든 코드가 맞지만 runtime.freeMemory()를 호출하기 전에 GC : System.gc()를 호출해야합니다.

if (i % 1000 == 0) { 
      try { 
       System.gc(); 
       Thread.sleep(500); 
       System.out.println("Free Memory:" + runtime.freeMemory()/kb + " Kb"); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
+0

+1 for System.gc(). 그것은 출력을보다 정확하게 만들었습니다. – ka3ak

관련 문제