오버플로우 내기...
우미
심심해서 오버플로우내기를 해봤습니다...
재귀함수 호출을 해봤습니다.. 이런식으로..
static int aaa = 0;
public static void recu()
{
aaa++;
System.out.println(aaa);
recu();
}
음.. 16635까지 찍고 java.lang.StackOverflowError 에러를 내고 죽네요..
그냥 while문으로 vector에다가 int를 집어넣어 봤습니다.
Vector v = new Vector();
int aa = 0;
while(true)
{
v.add(aa);
System.out.println(aa);
aa++;
}
2621439 까지 찍고 java.lang.OutOfMemoryError: Java heap space 에러를 내고 죽네요..사실 애초의 목적은 JVM의 Heap Size를 알아보려고 한 것이었는데...
이렇게 까지 차이가 나야 하는 이유를 모르겠네요;;
메소드를 반복해서 메모리에 잡았으니까 스택오버플로우가 나고
변수를 반복해서 잡았으니까 힙에서 아웃오브메모리가 뜨는건 맞는거 같은데...
애초에 오버플로우가 메모리에서 이 스택과 힙이 만나는 순간 나는거 아닌가요?
그럼 이렇게 까지 두개가 차이가 날리가 없을거 같은데요;;
저에게.. 지혜를 내려주세요..ㅠ_ㅠ
-
엄지
JVM 자체가 클래스, 스택, 힙, 네이티브 메모리 공간으로 구성되어있고 각각의 메모리 스페이스는 별개의 영역이라고보시면 됩니다.
-
들찬
재미있는 결론이네요 ㅎㅎ 이런 쪽은 실험을 안 해봐서...
-
새난
기억이 맞다면 (가물가물하지만;;;) 스택 영역과 힙 영역의 크기가 각각 제한이 된 것으로 기억합니다. 둘이 충돌할 때 생기는 것이 아니지요