programing

Windows XP의 Java 최대 메모리

nicescript 2022. 10. 30. 15:56
반응형

Windows XP의 Java 최대 메모리

32비트 Windows XP(Java 1.4, 1.5 및 1.6)에서 실행되는 Java SE에 1400MB를 항상 할당할 수 있었습니다.

java -Xmx1400m ...

오늘 Java 1.5_16 및 1.6.0_07을 사용하는 새로운 Windows XP 머신에서 동일한 옵션을 시도했는데 다음과 같은 오류가 발생했습니다.

Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.

시행착오를 거치면서 1200메가바이트는 이 기계에 할당할 수 있는 최대 용량인 것 같습니다.

왜 한 기계는 1400대, 다른 기계는 1200대만 허용하는지 아십니까?

편집: 머신에는 약 3.5의 4GB의 RAM이 탑재되어 있습니다.Windows에서 인식할 수 있는 GB입니다.

Windows에는 가상 메모리 관리 기능이 있으며 JVM에는 주소 공간에 연속된 메모리만 필요합니다.따라서 시스템에서 실행 중인 다른 프로그램이 힙 크기에 영향을 줄 필요는 없습니다.방해가 되는 것은 주소 공간에 로드되는 DLL입니다.링크 중에 DLL 재배치를 최소화하는 Windows 최적화로 인해 단편화된 주소 공간이 생길 가능성이 높아집니다.통상적인 것 외에 주소 공간에 침입할 가능성이 높은 것은 보안 소프트웨어, CBT 소프트웨어, 스파이웨어 및 기타 형식의 악성 프로그램입니다.다양한 보안 패치, C 런타임 버전 등이 변동의 원인일 수 있습니다.디바이스 드라이버 및 기타 커널 비트에는 자체 주소 공간(4GB 32비트 공간 중 나머지 2GB)이 있습니다.

JVM 프로세스에서 DLL 바인딩을 검토하고 DLL의 기본 설정을 보다 콤팩트한 주소 공간으로 변경하는 방법을 검토할 수 있습니다.재미는 없지만 절박하다면...

또는 64비트 윈도우즈 및 64비트 JVM으로 전환할 수도 있습니다.다른 사람의 제안에도 불구하고 RAM은 더 많이 소비되지만 가상 주소 공간은 훨씬 더 많아지고 2GB를 연속적으로 할당하는 것은 쉽지 않습니다.

이것은 연속 메모리와 관련이 있습니다.

이전에 "VM god"에서 온 것으로 추정되는 사람에게 물어본 정보를 온라인에서 찾아냈습니다.

힙에 연속된 메모리 영역이 필요한 이유는 힙의 시작부터 (스케일링된) 오프셋에 의해 인덱싱되는 사이드 데이터 구조가 많이 있기 때문입니다.예를 들어 힙의 512바이트마다 1바이트가 있는 "카드 마크 배열"을 사용하여 개체 참조 업데이트를 추적합니다.참조를 힙에 저장할 때는 카드 마크 배열에 대응하는 바이트를 표시해야 합니다.점포의 행선지 주소를 오른쪽 이동해, 그것을 사용해 카드 마크 배열을 색인화합니다.자바에서는 할 수 없는 재미있는 어드레싱 산수 게임 C++에서 플레이할 수 있습니다.

통상, 인접하는 지역(최대 1.5개)을 취득하는 것은 문제 없습니다.Windohs의 경우 GB(최대 약 3.8)Solaris의 경우 GB.YMMV).Windoh의 경우 JVM이 시작되기 전에 로드되어 주소 공간을 분할하는 라이브러리가 있다는 것이 가장 큰 문제입니다./3GB 스위치를 사용해도 이러한 라이브러리는 기본이 되지 않기 때문에 여전히 문제가 되고 있습니다.

우리는 덩어리 더미를 만드는 방법을 알고 있지만, 그것들을 사용하는 데 약간의 오버헤드가 있을 것이다.32비트 JVM의 대규모 힙보다 더 빠른 스토리지 관리에 대한 요청이 더 많습니다.큰 힙을 사용하려면 64비트 JVM으로 전환하십시오.아직 연속된 메모리가 필요하지만 64비트 주소 공간을 사용하는 것이 훨씬 쉽습니다.

Windows 의 Java 힙사이즈 제한은 다음과 같습니다.

  • 32비트 Java에서 사용 가능한 최대 힙 크기: 1.8 GB
  • 32비트 Java 권장 힙 크기 제한: 1.5GB(또는 /3GB 옵션의 경우 1.8GB)

이는 Java 힙을 더 크게 만드는 데 도움이 되지 않지만, 이제 이러한 값을 초과할 수 없다는 것을 알게 되었습니다.

연속되지 않은 히프를 처리할 수 있는 Oracle JRockit은 /3GB 스위치를 사용하는 Windows 2003/XP에서 Java 힙 크기를 2.85GB로 설정할 수 있습니다.플래그멘테이션은 Java 힙의 크기에 상당한 영향을 미칠 수 있습니다.

JVM에는 연속된 메모리가 필요합니다.다른 실행 중인 메모리, 이전에 실행한 메모리 및 Windows에서 메모리를 관리하는 방법에 따라서는 최대 1.4까지 사용할 수 있습니다.연속 메모리 GB64비트 윈도라면 더 큰 힙을 만들 수 있을 것 같아요.

Sun의 JVM에는 연속 메모리가 필요합니다.따라서 사용 가능한 메모리의 최대 용량은 메모리 조각화에 의해 결정됩니다.특히 드라이버의 dll은 미리 정의된 기본 주소에 로드할 때 메모리를 단편화하는 경향이 있습니다.따라서 하드웨어와 드라이버에 따라 메모리 용량이 결정됩니다.

이에 대한 Sun 엔지니어의 진술과 함께 두 가지 출처: 포럼 블로그

다른 JVM?하모니 먹어봤어?비연속 기억을 허용하려고 했던 것 같아요.

이 응답에 의해 암시된 Windows 구성 방법과 더 관련이 있다고 생각합니다: Java - Xmx 옵션

기타 테스트:768MB의 물리 RAM(가상 메모리 포함)만 있는 오래된 Windows XP 머신에 1300MB를 할당할 수 있었습니다.2GB RAM 머신에서는 1220MB밖에 사용할 수 없습니다.기타 다양한 기업용 머신(구식 Windows XP 탑재)에서는 1400MB를 사용할 수 있었습니다.1220 MB의 제한은 매우 새로운 머신(델에서 구입한 지 얼마 안 됨)이기 때문에, Windows XP Pro 버전 2002 SP2를 실행하고 있는 Windows 및 DLL을 탑재하고 있을 가능성이 있습니다.

(메모리 제한이 있는) virtuozzo VPS에서 Java 프로그램을 실행할 때 이 오류 메시지가 나타납니다.메모리 인수를 지정하지 않았습니다만, 디폴트가 너무 높았던 것이 틀림없기 때문에, 소량을 명시적으로 설정할 필요가 있었습니다.예: -Xmx32m(실행하는 프로그램에 따라 분명히 튜닝이 필요함)

질문자처럼 대용량 메모리를 지정하지 않고 다른 사람이 위의 오류 메시지를 받을 경우를 대비해서 여기에 입력합니다.

Sun의 JDK/JRE는 대용량 블록을 할당하는 경우 연속된 양의 메모리가 필요합니다.

OS 및 초기 앱은 로드 중에 비트와 조각을 할당하는 경향이 있으며, 이로 인해 사용 가능한 RAM이 단편화됩니다.연속 블록을 사용할 수 없는 경우 SUN JDK는 사용할 수 없습니다.Bea(Oracle에 인수됨)의 JRockit은 조각에서 메모리를 할당할 수 있습니다.

모든 사람들이 연속된 메모리에 대해 대답하는 것처럼 보이지만, 더 긴급한 문제는 인식하지 못하고 있다.

메모리를 100% 연속 할당해도 32비트 Windows OS(*기본값)에서는 2 GiB 힙 크기를 설정할 수 없습니다.이는 32비트 Windows 프로세스에서는 2GiB 이상의 공간을 처리할 수 없기 때문입니다.

Java 프로세스에는 힙 외에 perm gen(Java 8 이전), 스레드당 스택 크기, JVM/라이브러리 오버헤드(빌드별로 상당히 증가)가 모두 포함됩니다.

또한 JVM 플래그와 그 기본값은 버전 간에 변경됩니다.다음을 실행하기만 하면 몇 가지 정보를 얻을 수 있습니다.

 java -XX:+PrintFlagsFinal

많은 옵션이 힙 내/외부 메모리 분할에 영향을 미칩니다.2 GiB 정도만 가지고 놀면...

이 답변의 일부를 재사용하려면(Tomcat에 관한 것이지만 Java 프로세스에 적용됩니다)

Windows OS 에서는, 32비트 프로세스의 메모리 할당이 합계 2 GiB 로 제한됩니다(디폴트).

프로세스에는 다른 메모리(JVM/라이브러리 오버헤드, perm gen space 등)도 할당되어 있기 때문에 약 1.5 GiB 힙스페이스를 할당할 수 있습니다.

32비트 Windows는 2GB의 프로세스 주소 공간 제한을 두고 64비트 Windows는 4GB의 제한을 두는 이유는 무엇입니까?

기타 최신 운영체제[cough Linux]에서는 32비트 프로세스가 4GiB 주소 지정 가능 공간의 전체(또는 대부분)를 사용할 수 있습니다.

즉, 32비트 프로세스의 제한을 4GiB(32비트에서는 3GiB)로 늘리도록 64비트 Windows OS를 구성할 수 있습니다.

http://msdn.microsoft.com/en-us/library/windows/desktop/aa366778(v=vs.85).aspx

페이지 크기를 늘리는 방법은 다음과 같습니다.

  1. 내 컴퓨터를 오른쪽 클릭합니다---> 속성---> 상세
  2. [퍼포먼스]섹션에서 [설정]을 클릭합니다.
  3. [상세설정] 탭을 클릭합니다.
  4. 가상 메모리 섹션에서 변경을 클릭합니다.현재 페이징 사이즈가 표시됩니다.
  5. HDD 공간을 사용할 수 있는 드라이브를 선택합니다.
  6. 초기 사이즈와 최대 사이즈... (초기 사이즈 0 MB, 최대 사이즈 4000 MB 등) (필요한 만큼)를 지정합니다.

**히프 사이즈는 다음과 같이 변경할 수 있습니다.

  1. file -> setting -> build, excellation, deployment -> 여기서 힙사이즈를 확인할 수 있습니다.
  2. file - > setting - > build, excellation, deployment - > andriod도 여기에 있습니다.같은 문제에 직면했을 경우, 이것을 Andriod 프로젝트에 참조할 수 있습니다.

나에게 효과가 있었던 건

  1. 적절한 JAVA_를 설정합니다.Java가 업데이트될 경우를 대비해서 HOME 경로입니다.

  2. 새 시스템 변수 컴퓨터 생성 -> 속성 -> 고급 설정 -> 새 시스템 변수 생성

이름: _JAVA_OPTION 값: -Xmx750m

참고로 기본 VM 옵션은 Intellij help -> edit custom VM 옵션에서 찾을 수 있습니다.이 파일에는 힙의 최소 크기와 최대 크기가 표시됩니다.**

우선 RAM이 4GB일 때 페이지 파일을 사용하는 것은 소용이 없습니다.Windows 에서는, 4 GB이상 액세스 할 수 없기 때문에(실제로 메모리 구멍 때문에 적게), 페이지 파일은 사용되지 않습니다.

둘째, 주소 공간은 커널의 경우 절반, 사용자 모드의 경우 절반으로 분할됩니다.애플리케이션에 추가 RAM이 필요한 경우 boot.ini의 /3GB 옵션을 사용합니다(자세한 내용은 java.exe가 "대주소 인식"으로 표시되어 있는지 확인하십시오).

셋째, java가 내부적으로 메모리(스레드, JIT 컴파일러, VM 초기화 등)를 낭비하기 때문에 2GB의 주소 공간을 모두 할당할 수 없다고 생각합니다.자세한 내용은 /3GB 스위치를 사용하십시오.

언급URL : https://stackoverflow.com/questions/171205/java-maximum-memory-on-windows-xp

반응형