2010-08-18 4 views
17

필자는 Java가 수동으로 힙 크기를 설정해야하는 이유에 대해 항상 궁금해했습니다. 다른 언어로 작성된 프로그램은 OS가 더 이상 할당 할 수 없을 때까지 프로그램이 실행될 때 필요한만큼의 메모리를 할당한다는 인상을 받았습니다.왜 Java 힙 크기를 지정해야합니까?

자바에서는 힙, 스택 및 permgen 크기를 설정해야합니다. 이것이 "충분히 큰"숫자로 늘리는 것을 잊어 버리는 것은 간단하지만 서버가 떨어지는 것을 보았습니다.

시간이 지남에 따라 필요한만큼 힙/스택/permgen을 확장하도록 Java에 지시 할 수없는 이유는 무엇입니까?

답변

4

나의 해석은 Sun은 Big Box를 판매하는 회사이며 시스템 관리자가이 상자에서 작업을 수행 할 수 있다는 점입니다. 모든 메모리를 채우기 위해 시스템을 실행하는 것이 좋은 방법입니다. 예를 들어 로그인 셸을 만들기 위해 메모리를 할당 할 수 없기 때문에 효율적으로 작업을 복원 할 수 없습니다.

4

컴퓨터의 실제 메모리가 유한하므로 생각합니다. 따라서 JVM을 사용하면 모든 메모리가 낭비되기 전에 memleak을 감지 할 수 있습니다.
같은 시스템에서 여러 JVM을 실행하는 경우 수행 할 작업 -이 경우 각 JVM을 "필요한만큼"확장 할 수있는 방법은 무엇입니까?

1

동적으로 힙, 스택 및 permgen 크기를 늘리면 어쨌든 서버가 다운됩니다. 그런 세상에서 서버는 결국 모든 리소스를 유출합니다.

또한 자동 메모리 관리를 개발하는 것은 오늘날과 같이 성숙하지 않았습니다. 가상 한계를 지정하면 잘못된 기본값을 선택하면 작업이 더 쉬워집니다. 그러나 백엔드에서 코딩 효율을 약간 떨어 뜨릴 수 있습니다.

예, 이것은 추측이지만 합리적인 것입니다. 특히 Java/Oak의 임베디드 셋톱 박스 프로그래밍의 기원을 고려할 때 더욱 그렇습니다. 임베디드 시스템이 스왑 또는 디스크 백업 가상 메모리를 갖지 않을 것이므로 JVM을 사용 가능한 것처럼 작동하게 만드는 이유는 무엇입니까?

7

세 가지 이유는 :

  1. 자바는 웹 응용 프로그램을 작성하기위한 언어로 구성 되었기 때문에. 일반적으로 웹 응용 프로그램이 모든 컴퓨터 자원을 인계받는 것이 좋은 생각이라고 생각하지 않습니다.
  2. 자바가 가비지 수집되기 때문에. 메모리의 상한을 지정할뿐만 아니라 힙 크기도 가비지 콜렉션을 트리거합니다. 근본적으로 당신은 "당신은 이것을 많이 사용할 수 있지만, 당신이 그 한계를 치면 당신은 깔끔하게해야합니다"라고 말하고 있습니다.
  3. Java 프로세스에서 사용하는 메모리 양을 제한하려는 많은 클래스의 응용 프로그램이 있습니다 (예 : 둘 모두에 대한 메모리가 충분하지 않을 때 다른 프로세스가 계속 진행되는 것이 더 중요합니다.
  4. 힙 크기를 제한 할 수있는 은 기능이입니다. 프로세스가 무제한 메모리를 가질 수있는 접근 방식을 선호한다면 (언급 된 다른 언어 에서처럼) 힙 제한을 획득 할 수있는 것보다 더 많이 설정할 수 있습니다. 힙 크기를 제한하려면 그렇게 할 수 있습니다. 다른 언어는 가능한 행동 중 하나만 가지고 있기 때문에 유연성이 떨어집니다.
+2

첫 번째 지점에 대한 정보가 있습니까? 나는 "자바가 웹 어플리케이션을 작성하기위한 것이었다"는 말을 들어 본 적이 없다. (자바의 역사를 파고 들지는 않았지만 ...) – Mike

+2

신의 경지.Java는 정교한 케이블 TV 튜너에서 가질 수있는 것과 같은 셋톱 박스 소프트웨어를 구현하려는 Oak의 자손입니다. 가비지 콜렉션이 실행되는 한, 메모리 한계에 도달하지 않을 때가 아니라 오브젝트에 액세스 할 수 없을 때 가비지가 수집됩니다. –

+0

@Edwin Buck :'메모리 한계에 도달했을 때가 아니라 객체에 접근 할 수 없을 때 가비지가 수집됩니다. '그렇지만 "즉시"GCd가 아닙니다. 수행해야 할 속도는 힙 크기에 따라 달라지며 성능에 매우 중요 할 수 있습니다. –

관련 문제