JVM에서 힙 크기가 고정되는 이유는 무엇입니까?


20

JVM을 너무 많이 확인하지 않았지만 그렇게하지 않은 JVM을 고정 힙 크기로 실행 해야하는 이유를 누구나 설명 할 수 있습니까? 간단한 연속 힙으로 구현하는 것이 더 쉽다는 것을 알고 있지만 Sun JVM은 이제 10 년이 넘었으므로이를 개선 할 시간이 있었을 것으로 예상됩니다.

시작시 프로그램의 최대 메모리 크기를 정의 해야하는 것은 1960 년대와 같은 일이며 OS 가상 메모리 관리와의 상호 작용이 잘못되었습니다 (GC는 스왑 아웃 데이터 검색, Java 프로세스의 메모리 용량을 결정할 수 없음) 실제로 OS 측에서 사용하면 엄청난 양의 VM 공간이 낭비됩니다 (나는 당신이 멋진 48 비트 머신에 신경 쓰지 않는다는 것을 알고 있습니다 ...). 또한 JVM (EE 응용 프로그램 서버, OSGi) 내에 작은 운영 체제를 구축하려는 여러 가지 슬픈 시도는이 상황에서 적어도 부분적으로 책임을 져야한다고 생각합니다. 시스템에서 여러 Java 프로세스를 실행하면 자원이 낭비되기 때문에 피크에서 사용해야 할 메모리를 각각 제공하십시오.

놀랍게도, 구글은 내가 기대했던 것에 대한 분노의 폭풍을 일으키지 않았지만, 수백만의 사람들이 고정 된 힙 크기를 알아 내고 사실을 받아들이는 것에 묻 혔을 수도 있습니다.


JVM 자체에 약간의 공간이 필요하기 때문에 EE 애플리케이션 서버의 설계는 이러한 "환경"이 없어도 완벽하게 이해할 수 있으며 스레드 간 전환은 프로세스 간 전환보다 저렴합니다. 이는 90 년대 후반 Java를 크게 만든 것 중 하나입니다.
Michael Borgwardt

이것은 친절하게 비난을 받았으며, 당신이 그것에 얼마나 많은 생각을했는지 궁금합니다. 예를 들어 힙 제한이없는 경우 GC / 스왑 상호 작용은 어떻게 변경됩니까? VM 공간은 어떻게 낭비됩니까? 사용 여부에 관계없이 2 / 3Gb 공간을 확보 할 수 있으며 해당 공간의 한계를 밀고있는 경우 고정 힙 또는 부동 힙이 있는지 여부는 중요하지 않습니다. 이를 위해 여러 JVM이 스왑 이외의 다른 것을 어떻게 낭비합니까 (시스템 목적에 맞게 적절히 구성해야합니까)?
kdgregory

2
그것은 일종의 난폭 한 일이지만 Java 기반 플랫폼을 작성하고 운영하는 수년간의 일상 경험에 의해 알려집니다. 스왑을 수행하지 않는 경우 (런 어웨이 프로세스에 할당 할 공간이 부족할 때까지 시스템이 20 분 동안 응답하지 않고) 안정성 이유로 메모리 오버 커밋이 해제 된 경우 (OOM 킬러는 희생자를 선택하는 데 매우 적합하지 않음) ), VM 공간에 관심이 있으며 아래 사람들이 암시하는 것과는 달리 -Xmx2048m으로 Java VM을 시작하면 하나의 변수가있는 프로그램에 대해 2GB의 가상 메모리 (적어도 Linux의 Sun JVM에서는)가 즉시 할당됩니다.
themel

훌륭한 질문입니다. 같은 것을 궁금해했습니다. 그러나 여기 q에 제시된 "사실"중 어떤 것이 정확합니까?
Martin Ba

당신이 찾고 있던 반응을 위해, 단순히 태양 버그 추적기와 함께 mosey ... 예를 들어 여기 , 여기 그리고 여기 . 그것들을 읽고 분개 한 분노를 느끼십시오 :)
기본

답변:


23

당신은 잘못. JVM의 힙 크기는 고정되어 있지 않으며 제한되어 있습니다.

  • -Xmx는 최대 힙 메모리 크기를 설정합니다
  • -Xms는 최소 힙 메모리 크기를 설정합니다

여러 가지 이유로 상한을 설정해야합니다. 먼저 가비지 컬렉터에게 언제 작동하는지 알려줍니다. 둘째, 너무 많은 메모리를 소비하여 JVM이 전체 시스템을 막지 못하게합니다. 최소 힙 크기는 아마도 다른 프로세스가 너무 많이 소비하기 때문에 메모리 부족을 방지하기 위해 프로그램에 필요한 최소한의 메모리를 예약하는 데 유용합니다.


9
많은 힙을 반복적으로 할당해야 할 때 느린 시작을 피하기위한 최소값이 기본값이 아닙니다. 페이징은 물리적 램 부족을 처리합니다.
ratchet freak

내 두 번째 추측 ;-)했다 @ratchetfreak
user281377을

이 경우라면 최대 힙 메모리 크기없이 어떻게 C #을 잘 실행할 수 있습니까?
cmorse

cmorse : 나는 단지 추측 할 수있다. Java는 많은 응용 프로그램이 리소스를 공유하고 엄격하게 적용되는 제한이 바람직한 대규모 서버를 대상으로하는 반면 .net은 PC 및 소규모 전용 ​​서버를 위해 만들어졌습니다.
user281377

@ user281377 : 힙 공간이 부족한 Java 응용 프로그램은 일반적으로이를 거의 제대로 처리하지 못합니다. 그리고 ASP.net은 크고 작은 서버 모두에서 잘 작동합니다. 내가 실제로 얻지 못하는 것은 기본적으로 Java 가이 제한을 시행하는 이유입니다. 나는 그들의 결정 뒤에 추론에서 듣고 싶습니다 ... 나는 그들이 좋은 이유가 있다고 확신합니다.
cmorse

6

대답은 Java의 유산과 관련이 있다고 생각합니다. 원래 리소스가 제한되어 있고 사용 가능한 모든 것을 간단히 처리하는 프로세스를 원하지 않는 임베디드 시스템에 사용되는 언어로 설계되었습니다. 리소스 제한을 설정할 수 있으면 서버에서 리소스를보다 쉽게 ​​프로비저닝 할 수 있으므로 시스템 관리에도 도움이됩니다. 최신 JVM은 여러 비 연속 힙을 사용하는 것으로 보이지만 물론 모든 코드가 단일 힙으로 표시됩니다.

(FWIW, Apple의 다윈 이전 MacOS 버전 (어쨌든 마지막으로 사용한 시스템 7까지)에서 프로그램의 메모리 요구 사항을 지정해야했습니다.


1
+1-(1) 실제로 문제를 해결 한 유일한 답변이고 (2) 그럴듯한 사람이 되었기 때문입니다.
kdgregory

2

당신은 GC를 줄 필요가 어떤 메커니즘을 실행하는 방법을 알려줄 수, 또는 당신의 프로그램이 전체 가상 메모리 공간을 채울 것입니다. 경과 시간, 할당 수, 할당 수, 아마도 내가 지금 생각할 수없는 다른 방법으로 GC를 트리거하는 여러 가지 방법이 있습니다. IMO는 단순히 메모리 경계를 설정하고 할당 된 공간이 해당 경계에 도달 할 때 GC를 실행하는 것만 큼 좋은 것은 없습니다.

핵심은 올바른 경계 를 설정하는 것 입니다. 내가보고 -ms"이 얼마나 많은 메모리 내 응용 프로그램의 요구이다"로하고 -mx같은 "은이 금액을 초과해서는 안됩니다." 프로덕션 배포에서 두 개는 같지 않으면 가깝고 실제 측정 된 요구 사항을 기반으로해야합니다.

"폐기 된"가상 메모리에 대한 귀하의 우려는 잘못되었습니다 : 가상, 거의 (무료). 예, 힙에 할당량을 너무 크게 지정하면 스레드를 시작하거나 메모리 매핑 된 파일을로드 할 수 없습니다. 그러나 이는 응용 프로그램 설계의 일부입니다. 자원이 부족하여 응용 프로그램을 실행할 수있는 방식으로 분할해야합니다. 메모리 상단에 닿을 때까지 확장되는 "C 스타일"힙에서 기본 문제는 동일합니다. 문제가 생길 때까지 생각할 필요는 없습니다.

모든 쓰기 가능한 세그먼트는 스왑의 커밋이 필요하기 때문에 큰 힙이 "폐기"할 수있는 유일한 것은 스왑 공간입니다. 그러나 이는 시스템 설계의 일부입니다. 동일한 상자에서 많은 JVM을 실행하려면 스왑을 늘리거나 힙 할당을 줄이십시오. 그들이 스 래싱을 시작하면 시스템을 너무 많이 사용하려고합니다. 더 많은 메모리를 구입하십시오 (여전히 32 비트 프로세서를 실행중인 경우 새 상자를 구입하십시오).


1
그러나 GC를 실행하기위한 임계 값은 프로그램의 총 메모리 사용을 초과 할 수없는 고정 된 임계 값과 관련이 없습니다. (실제로 그렇게해서는 안됩니다. 큰 힙이 있고 가득 차있을 때 GC 만 할 수있는 경우 반드시 GC 기간이 거의 필요하지 않습니다). 세대 별 가비지 콜렉션을 참조하십시오.
Ben

@Ben-네, 맞습니다. 그리고 두 번째 문장은 대안이 있다고 지적합니다. 그러나 고정 크기 힙이 일반적인 경우 GC를 관리하는 잘못된 방법이라는 데 동의하지 않습니다. 올바르게 조정 된 JVM은 "올바른"힙 크기를 사용합니다. 내 경험에 따르면 JVM이 올바르게 조정되지 않으면 긴 GC 일시 중지가 발생합니다. 그리고 종종 "올바른"힙 크기는 생각보다 훨씬 작습니다.
kdgregory

-2

user281377과 같이 프로세스에서 사용할 수 있는 메모리 양의 상한 만 지정합니다 . 물론 응용 프로그램 자체는 필요한 공간 만 차지합니다.

기본 상한이 있어야하는지 여부는 pro와 contra의 다른 질문입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.