Windows XP의 Java 최대 메모리


103

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 만 허용하는 이유에 대한 아이디어가 있습니까?

편집 : 컴퓨터에는 Windows가 인식 할 수있는 약 3.5GB의 4GB RAM이 있습니다.


64 비트 WindowsXP 시스템은 드물지만 적어도 내 경험으로는 32 비트 셸 또는 64 비트 셸에서 앱을 실행하는 것의 최대 차이를 알 수 있습니다.
djangofan

답변:


124

Windows에는 가상 메모리 관리 기능이 있으며 JVM 에는 주소 공간에서 연속적인 메모리 만 필요 합니다 . 따라서 시스템에서 실행되는 다른 프로그램이 반드시 힙 크기에 영향을주는 것은 아닙니다. 당신의 길을 가로막는 것은 당신의 주소 공간에로드되는 DLL들입니다. 안타깝게도 연결 중에 DLL의 재배치를 최소화하는 Windows의 최적화로 인해 주소 공간이 조각화 될 가능성이 높아집니다. 일반적인 항목 외에 주소 공간에 침입 할 가능성이있는 항목에는 보안 소프트웨어, CBT 소프트웨어, 스파이웨어 및 기타 형태의 맬웨어가 포함됩니다. 차이의 가능한 원인은 다른 보안 패치, C 런타임 버전 등입니다. 장치 드라이버 및 기타 커널 비트에는 자체 주소 공간이 있습니다 (4GB 32 비트 공간의 다른 2GB).

당신은 보다 컴팩트 한 주소 공간에 DLL의를 리베이스 노력에 당신의 JVM 과정과 모습에 DLL 바인딩을 통과하려고합니다. 재미 없지만 절망적이라면 ...

또는 64 비트 Windows 및 64 비트 JVM으로 전환 할 수 있습니다. 다른 사람들이 제안한 것에도 불구하고 더 많은 RAM을 차지하지만 훨씬 더 연속적인 가상 주소 공간을 갖게되며 2GB를 연속적으로 할당하는 것은 사소한 일입니다.


5
프로세스 탐색기를 사용하여 메모리 dll이로드되는 위치를 확인합니다. 종종 일부 업데이트 된 드라이버가 주소 공간 중간에 고정됩니다. REBASE 명령을 사용하면 쉽게 밀어 낼 수 있습니다. 그러나 dll이 다시 업데이트되어 문제가 발생할 수 있음을 명심하십시오.
brianegge

2
나는 이것을 대답으로 받아들이지 않았지만 stackoverflow는 대답으로 표시했습니다.
Steve Kuo

@Christopher, 32 비트 Windows XP에서 64 비트 JVM을 사용할 수 있습니까?
Pacerier

@Pacerier 죄송합니다. 질문을 놓쳤습니다. AFAIK, 불가능합니다. OS X에는 32 비트 커널을 사용하는 64 비트 사용자 공간에 대한 몇 가지 트릭이 있었지만 Windows에서는 그런 일을 들어 본 적이 없습니다.
Christopher Smith

@ChristopherSmith, Btw, " 시스템에서 실행되는 다른 프로그램이 반드시 힙 크기에 영향을주지 않아야한다 "고 언급하셨습니다 . 그렇다면이 결과를 어떻게 설명 할 수 있습니까? stackoverflow.com/questions/9303889/… ?
Pacerier

50

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

다음 은 "VM 신"이 전한 질문을 온라인 에서 찾은 정보입니다 .

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

보통 우리는 적당한 연속 영역을 얻는 데 문제가 없습니다 (Windohs에서 최대 약 1.5GB, Solaris에서 최대 약 3.8GB. YMMV.). Windohs에서 문제는 대부분 JVM이 시작되기 전에로드되어 주소 공간을 분할하는 라이브러리가 있다는 것입니다. / 3GB 스위치를 사용하면 해당 라이브러리를 리베이스하지 않으므로 여전히 문제가됩니다.

청크 힙을 만드는 방법을 알고 있지만이를 사용하는 데 약간의 오버 헤드가 있습니다. 32 비트 JVM에서 더 큰 힙보다 더 빠른 스토리지 관리에 대한 요청이 더 많습니다. 정말로 큰 힙을 원한다면 64 비트 JVM으로 전환하십시오. 우리는 여전히 연속적인 메모리가 필요하지만 64 비트 주소 공간에서 얻는 것이 훨씬 쉽습니다.


매우 흥미 롭습니다. 나는 항상 왜 1500MB인지 스스로에게 물었고, 이제 그것을 얻었습니다. 감사합니다!
Tim Büthe

3
오래된 질문에 대한 후속 조치로 죄송하지만 이것이 지금까지 본 최고의 답변입니다. 그러나 최대 힙 크기를 얻을 수없는 경우 JVM이 시작시 실패하는 이유는 무엇입니까? 최소 크기 이상의 최상의 크기로 조용히 안주하지 않습니까?
Stroboskop 2014

19

Windows의 Java 힙 크기 제한은 다음과 같습니다.

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

이것은 더 큰 Java 힙을 얻는 데 도움이되지 않지만 이제 이러한 값을 넘어 설 수 없다는 것을 알고 있습니다.


10

인접하지 않은 힙을 처리 할 수있는 Oracle JRockit 은 / 3GB 스위치가있는 Windows 2003 / XP에서 2.85GB의 Java 힙 크기를 가질 수 있습니다. 단편화는 Java 힙의 크기에 상당한 영향을 미칠 수 있습니다.


6

JVM은 연속적인 메모리를 필요로하며, 실행중인 다른 항목, 이전에 실행중인 항목 및 Windows가 메모리를 관리하는 방법에 따라 최대 1.4GB의 연속 메모리를 확보 할 수 있습니다. 64 비트 Windows는 더 큰 힙을 허용 할 것이라고 생각합니다.


2
나는 현대 운영 체제가 지속적인 메모리를 에뮬레이트한다고 생각합니다. 80486 이후 x86 아키텍처는 물리적 메모리를 쉽게 재 배열 할 수 있도록 페이징을 지원합니다.
Mnementh

3
Mnemeth : 첫째, WINAPI에는 Windows에서 자체 메모리를 관리하는 것이 더 나은 데이터베이스 및 VM과 같은 고급 도구를위한 특정 API (AllocateUserPhysicalPages)가 있습니다. 둘째, 페이징은
80486

6

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

이에 대한 두 가지 소스와 썬 엔지니어의 성명 : 포럼 블로그

어쩌면 다른 JVM? Harmony 를 사용해 보셨습니까 ? 나는 그들이 비 연속적인 기억을 허용 할 계획이라고 생각한다.


하지만 1GB RAM (가상 메모리 포함) 만있는 컴퓨터에 1300MB를 할당 할 수있었습니다. 내 2GB RAM 시스템 (가상 메모리 포함)은 1200MB 만 할당 할 수 있습니다.
Steve Kuo

하모니가 죽었 죠?
Pacerier

예 : "Apache Harmony는 2011 년 11 월 16 일부터 Apache Software Foundation에서 사용 중지되었습니다."
bobbel 2014 년

3

이 응답에 암시 된대로 Windows가 구성되는 방식과 더 관련이 있다고 생각합니다. Java -Xmx 옵션

추가 테스트 : 768MB의 물리적 RAM (가상 메모리 포함) 만있는 기존 Windows XP 시스템에 1300MB를 할당 할 수있었습니다. 2GB RAM 시스템에서는 1220MB 만 얻을 수 있습니다. 여러 다른 회사 컴퓨터 (구 Windows XP 사용)에서 1400MB를 얻을 수있었습니다. 1220MB 제한이있는 컴퓨터는 매우 새롭기 때문에 (방금 Dell에서 구입) 새 Windows 및 DLL (Windows XP Pro 버전 2002 SP2 실행)이있을 수 있습니다.


또한 가상 메모리 설정의 영향을받을 수 있습니다.
skaffman

내가 테스트하는 모든 컴퓨터에는 물리적 RAM의 최소 두 배 이상의 가상 메모리가 있습니다.
Steve Kuo

GC 성능이 매우 나빠질 것이기 때문에 Java와 함께 가상 메모리를 실제로 사용하고 싶지는 않습니다. 메모리 양은 이미로드 된 dll이 메모리를 조각화했는지에 따라 다릅니다.
kohlerm

2

(제한된 메모리) virtuozzo VPS에서 Java 프로그램을 실행할 때이 오류 메시지가 나타납니다. 메모리 인수를 지정하지 않았 으며 기본값이 너무 높아야 하므로 적은 양 을 명시 적으로 설정 해야했습니다. 예 : -Xmx32m (실행하는 프로그램에 따라 분명히 조정해야 함).

질문자가 한 것처럼 많은 양의 메모리를 지정하지 않고 다른 사람이 위의 오류 메시지를받을 경우를 대비하여 여기에 넣으십시오.


1

sun의 JDK / JRE는 거대한 블록을 할당하는 경우 연속적인 양의 메모리가 필요합니다.

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


1

모두가 연속적인 기억에 대해 대답하는 것 같지만 더 시급한 문제를 인정하는 것을 등한히했습니다.

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

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

또한 JVM 플래그와 해당 기본값은 버전간에 변경됩니다. 다음을 실행하면 몇 가지 아이디어를 얻을 수 있습니다.

 java -XX:+PrintFlagsFinal

많은 옵션이 힙의 메모리 분할에 영향을줍니다. 2GiB 중 어느 정도는 가지고 놀 수 있습니다.

답변의 일부를 재사용하려면 (Tomcat에 대해, 모든 Java 프로세스에 적용됨) :

Windows OS는 32 비트 프로세스의 메모리 할당을 총 2GiB (기본값)로 제한합니다.

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

32 비트 Windows는 2GB 프로세스 주소 공간 제한을 적용하지만 64 비트 Windows는 4GB 제한을 적용하는 이유는 무엇입니까?

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

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

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


1
이 답변은 그가 2GB 만 할당 할 수있는 이유만을 다루며, 한 컴퓨터에 1.4GB를 할당하고 다른 컴퓨터에 1.2GB 만 할당 할 수있는 이유가 아닙니다. 여기에 명시된 1.5GB, 2GB 또는 4GB 한도에 도달하지 않습니다.
vapcguy

1
JVM 플래그에 대한 단락은 버전에 따라 메모리가 다른 이유를 설명하는 방식으로 진행됩니다. 또한 힙 설정이 항상 총 프로세스 크기의 (큰) 부분이라는 점에 대한 내 요점을 주목하십시오. 따라서 그 이하의 설정은 여전히 ​​2GiB 프로세스 제한에 도달 할 수 있습니다. 다른 설정은 연속 메모리 할당에 의해 제한 될 수 있습니다.
Michael

또는 그가하고있는 1.4GB 할당에 대한 1.5GB 제한 일 수도 있습니다. 이제 더 의미가 있습니다. 설명해 주셔서 감사합니다.
vapcguy

0

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

  1. mycomputer ---> properties ---> Advanced를 마우스 오른쪽 버튼으로 클릭하십시오.
  2. 성능 섹션에서 설정을 클릭하십시오.
  3. 고급 탭을 클릭하십시오.
  4. 가상 메모리 섹션에서 변경을 클릭합니다. 현재 페이징 크기가 표시됩니다.
  5. HDD 공간이있는 드라이브를 선택합니다.
  6. 초기 크기 및 최대 크기를 제공합니다. 예를 들어 초기 크기 0MB 및 최대 크기 4000MB. (필요한만큼)

0

** 힙 크기를 변경하는 방법에는 여러 가지가 있습니다.

  1. file-> setting-> build, exceution, deployment-> compiler 여기에서 힙 크기를 찾을 수 있습니다.
  2. file-> setting-> build, exceution, deployment-> compiler-> andriod 여기에서도 힙 크기를 찾을 수 있습니다. 동일한 문제가 발생하면 andriod 프로젝트에 대해 이것을 참조 할 수 있습니다.

나를 위해 일한 것은

  1. Java가 업데이트 된 경우 적절한 JAVA_HOME 경로를 설정하십시오.

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

이름 : _JAVA_OPTION 값 : -Xmx750m

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


-1

첫째, RAM이 4GB 일 때 페이지 파일을 사용하는 것은 쓸모가 없습니다. Windows는 4GB 이상 (실제로는 메모리 부족으로 인해 더 적음)에 액세스 할 수 없으므로 페이지 파일이 사용되지 않습니다.

둘째, 주소 공간은 2, 커널의 절반, 사용자 모드의 절반으로 나뉩니다. 응용 프로그램에 더 많은 RAM이 필요한 경우 boot.ini에서 / 3GB 옵션을 사용하십시오 (java.exe가 "큰 주소 인식"으로 표시되어 있는지 확인하십시오 (자세한 내용은 Google 참조).

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


1
페이지 파일이 4GB 또는 RAM에서 쓸모 없다는 생각은 잘못되었습니다. 페이지 파일이 없으면 운영 체제는 물리적 RAM에서 사용되지 않는 프로세스 데이터 (사용하지 않는 서비스를위한 스택 공간 등)를 제거 할 수 없으므로 실제 작업에 사용할 수있는 RAM의 양이 줄어 듭니다. 페이지 파일이 있으면 RAM이 확보됩니다.
아무도 1
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.