64 비트 OS에서 32 비트 JVM의 최대 Java 힙 크기


107

32 비트 OS의 최대 주소 지정 가능 메모리 크기가 4GB이고 JVM의 최대 힙 크기는 예약 할 수있는 연속 여유 메모리 양에 따라 달라진다는 점을 고려할 때 32 비트 OS의 최대 힙 크기에 대한 질문이 아닙니다.

64 비트 OS에서 실행되는 32 비트 JVM의 최대 (이론적 및 실질적으로 달성 가능한) 힙 크기를 아는 데 더 관심이 있습니다. 기본적으로 SO 관련 질문의 그림 과 유사한 답변을 찾고 있습니다.

64 비트 대신 32 비트 JVM을 사용하는 이유는 기술적 인 것이 아니라 관리 / 관료적입니다. 프로덕션 환경에 64 비트 JVM을 설치하기에는 너무 늦었을 것입니다.

답변:


70

하나의 큰 메모리 청크를 갖고 원시 포인터를 사용할 것으로 예상되는 32 비트 JVM은 4Gb 이상을 사용할 수 없습니다 (포인터에도 적용되는 32 비트 제한이기 때문에). 여기에는 Sun과 IBM 구현도 포함됩니다. 예를 들어 JRockit 또는 다른 사람들이 32 비트 구현과 함께 대용량 메모리 옵션을 가지고 있는지 모르겠습니다.

이 한계에 도달 할 것으로 예상되는 경우 프로덕션 환경에 대해 64 비트 JVM의 유효성을 검사하는 병렬 트랙을 시작하는 것을 강력히 고려하여 32 비트 환경이 중단 될 때 준비 할 수 있도록해야합니다. 그렇지 않으면 압력을 받아 그 일을해야하는데 결코 좋지 않습니다.


2014-05-15 수정 : Oracle FAQ :

32 비트 JVM의 이론상 최대 힙 한계는 4G입니다. 사용 가능한 스왑, 커널 주소 공간 사용, 메모리 조각화 및 VM 오버 헤드와 같은 다양한 추가 제약으로 인해 실제로 제한은 훨씬 낮을 수 있습니다. 대부분의 최신 32 비트 Windows 시스템에서 최대 힙 크기는 1.4G에서 1.6G입니다. 32 비트 Solaris 커널에서 주소 공간은 2G로 제한됩니다. 32 비트 VM을 실행하는 64 비트 운영 체제에서는 최대 힙 크기가 더 높아져 많은 Solaris 시스템에서 4G에 접근 할 수 있습니다.

( http://www.oracle.com/technetwork/java/hotspotfaq-138619.html#gc_heap_32bit )


여기에 작업 압력이 없습니다. 64 비트 JVM이 처음에 설치되어야한다는 것을 알고 있습니다. 그러나 32 비트 JVM이 더 많은 리소스를 사용할 수있는 환경에서 어떻게 작동하는지 생각하게되었습니다.
Vineet Reynolds

1
서명으로 인해 약 2GB가 아닌가요? 아니면 그냥 Sun JVM입니까?
Sebastian Ganslandt

9
포인터는 서명되지 않습니다. 부정적인 메모리 위치를 말하는 것은 이치에 맞지 않습니다.
Thorbjørn Ravn Andersen

12
아니요, 서명으로 인해 2GB가 아닙니다. 그러나 4GB 주소 공간의 일부는 OS 커널 용으로 예약되어 있습니다. 일반 소비자 버전의 Windows에서 제한은 2GB입니다. Linux 및 Windows 서버 버전 (32 비트)에서 제한은 프로세스 당 3GB입니다.
Jesper

3
@Jesper 64 비트 운영 체제에서 실행되는 32 비트 JVM이 전체 4GB 주소 공간을 사용할 수 있는지 궁금합니다.
Thorbjørn Ravn Andersen 2012

90

Java Runtime에 요청할 수 있습니다.

public class MaxMemory {
    public static void main(String[] args) {
        Runtime rt = Runtime.getRuntime();
        long totalMem = rt.totalMemory();
        long maxMem = rt.maxMemory();
        long freeMem = rt.freeMemory();
        double megs = 1048576.0;

        System.out.println ("Total Memory: " + totalMem + " (" + (totalMem/megs) + " MiB)");
        System.out.println ("Max Memory:   " + maxMem + " (" + (maxMem/megs) + " MiB)");
        System.out.println ("Free Memory:  " + freeMem + " (" + (freeMem/megs) + " MiB)");
    }
}

기본 힙 할당을 기반으로 "최대 메모리"를보고합니다. 따라서 여전히 -Xmx( 핫스팟에서 ) 게임을해야합니다 . Windows 7 Enterprise 64 비트에서 실행되는 32 비트 HotSpot JVM은 최대 1577MiB를 할당 할 수 있습니다.

[C : scratch]> java -Xmx1600M MaxMemory
VM 초기화 중 오류 발생
개체 힙을위한 충분한 공간을 예약 할 수 없습니다.
자바 가상 머신을 만들 수 없습니다.
[C : scratch]> java -Xmx1590M MaxMemory
총 메모리 : 2031616 (1.9375MiB)
최대 메모리 : 1654456320 (1577.8125 MiB)
여유 메모리 : 1840872 (1.75559234619 MiB)
[C : 스크래치]>

반면에 64 비트 동일한 OS에 JVM 물론 그것의 매우 높은 (약 3TiB)

[C : 스크래치]> java -Xmx3560G MaxMemory
VM 초기화 중 오류 발생
개체 힙을위한 충분한 공간을 예약 할 수 없습니다.
[C : 스크래치]> java -Xmx3550G MaxMemory
총 메모리 : 94240768 (89.875MiB)
최대 메모리 : 3388252028928 (3184151.84297 MiB)
여유 메모리 : 93747752 (89.4048233032MiB)
[C : 스크래치]>

다른 사람들이 이미 언급했듯이 OS에 따라 다릅니다.

  • 32 비트 Windows의 경우 : 2GB 미만입니다 ( Windows 내부 책 에 사용자 프로세스 용으로 2GB가 표시됨)
  • 32 비트 BSD / Linux : <3GB (Devil Book에서 제공)
  • 32 비트 MacOS X : <4GB ( Mac OS X 내부 책자)
  • 32 비트 Solaris에 대해 잘 모르겠습니다. 위 코드를 사용해보고 알려주십시오.

64 비트 호스트 OS의 경우 JVM이 32 비트이면 위에서 설명한 것처럼 여전히 종속됩니다.

-업데이트 20110905 : 다른 관찰 / 세부 사항을 지적하고 싶었습니다.

  • 내가 이것을 실행 한 하드웨어는 6GB의 실제 RAM이 설치된 64 비트였습니다. 운영 체제는 Windows 7 Enterprise, 64 비트였습니다.
  • Runtime.MaxMemory할당 할 수있는 실제 양은 운영 체제의 작업 세트 에 따라 다릅니다 . VirtualBox도 실행하는 동안 이것을 실행 한 적이 있는데 HotSpot JVM을 성공적으로 시작할 수 없고-Xmx1590M 더 작아야한다는 것을 알았습니다. 이것은 또한 당시 작업 세트 크기에 따라 1590M 이상을 얻을 수 있음을 의미합니다 (Windows의 설계로 인해 32 비트의 경우 2GiB 미만일 것이라고 유지하지만)

13
나는 당신이 추측을하기보다는 실제로 테스트 한 것을 좋아합니다.
Jim Hurne 2011-08-25

3
@djangofan이 맞습니다. 프로그램은 104,856이 아니라 1,048,576 (1024 * 1024 또는 2 ^ 20)으로 나누어야합니다. 그러나 그것은 단지 디스플레이 일뿐입니다. 명령에서 알 수 있듯이 최대 힙 크기를 1,590MiB로 설정하려고했습니다.
Jim Hurne 2011-08-29

1
아주 (내가 말하고 싶은 답을 냉각 코드 예제, 대답을), 및 세부 사항은 모든 운영체제을 포함.
TGP1994

3
내 이전 댓글에 이어 : jdocs ( 최소한 Windows의 경우)는 -Xmx 및 -Xms 매개 변수에 1024의 배수 인 값을 지정해야 함을 지정합니다. 1590인지 확실하지 않으므로 이상하다고 생각합니다. 결과가 예상되어야합니다.
TGP1994

4
잘 발견 된 TGP1994. 나는 'M'과 'G'배수를 지정했기 때문에 크기 (바이트)는 어쨌든 1024 바이트의 배수가 될 것이라고 생각합니다. 예를 들어 1590M은 1590 * (1024 * 1024) = 1667235840 바이트 (1628160KiB-물론 1024의 짝수 배수)로 구문 분석됩니다.
mike

16

어떤 OS를 지정하지 않습니다 .

Windows (내 응용 프로그램-장기 실행 위험 관리 응용 프로그램)에서는 Windows 32 비트에서 1280MB 이상을 사용할 수 없음을 확인했습니다. 64 비트에서 32 비트 JVM을 실행하는 것이 어떤 차이를 만들지 모르겠습니다.

우리는 앱을 Linux로 이식했고 64 비트 하드웨어에서 32 비트 JVM을 실행하고 있으며 2.2GB VM을 매우 쉽게 실행했습니다.

가장 큰 문제는 메모리를 사용하는 용도에 따라 GC입니다.


나는 솔라리스 10의 한계를 알고 싶지만 그것은 내 문제에만 해당됩니다. 비오는 날에 다른 OS에 대해서도 알고 싶습니다. :)
Vineet Reynolds

Solaris에 대해 잘 모르겠습니다. VM 크기가 꽤 클 것으로 예상하고 Solaris에서 Java를 사용한 경험은 몇 년 전이었습니다. 그리고 Sun 하드웨어의 Sun OS에서 Sun VM이되는 것-모든 것이 잘 작동했습니다. 또한 Linux / Windows보다 Solaris에서 GC 문제가 적다고 믿게되었습니다.
Fortyrunner

이것은 어떤 Windows였습니까? Windows 32 비트 서버 버전이 많은 양의 메모리를 훨씬 더 잘 처리 할 수 ​​있다고 생각합니다.
Thorbjørn Ravn Andersen

아, 마지막으로 OS에 대한 언급 ;-) 64 비트 커널이 설치되어 있습니까?
Thorbjørn Ravn Andersen

Win2k 서버였습니다. Win2k3 로의 이동은 너무 늦었고 대신 Linux로 전환했습니다.
Fortyrunner

14

에서 4.1.2 힙 크기 조정 :

"32 비트 프로세스 모델의 경우 프로세스의 최대 가상 주소 크기는 일반적으로 4GB이지만 일부 운영 체제에서는이를 2GB 또는 3GB로 제한합니다. 최대 힙 크기는 일반적으로 2GB 제한에 대해 -Xmx3800m (1600m)입니다. ), 실제 제한은 응용 프로그램에 따라 다릅니다. 64 비트 프로세스 모델의 경우 최대 값은 본질적으로 무제한입니다. "

여기에서 꽤 좋은 대답을 찾았습니다 . Windows XP의 Java 최대 메모리 .


12

최근에 이것에 대한 경험이 있습니다. 최근에 Solaris (x86-64 버전 5.10)에서 Linux (RedHat x86-64)로 이식했으며 Linux에서 Solaris보다 32 비트 JVM 프로세스에 사용할 수있는 메모리가 적다는 것을 깨달았습니다.

Solaris의 경우 거의 4GB (http://www.oracle.com/technetwork/java/hotspotfaq-138619.html#gc_heap_32bit)가됩니다.

지난 몇 년 동안 Solaris에서 문제없이 -Xms2560m -Xmx2560m -XX : MaxPermSize = 512m -XX : PermSize = 512m 으로 앱을 실행 했습니다. 그것을 리눅스로 옮기려고 시도했고 시작할 때 무작위로 메모리 부족 오류가 발생했습니다. -Xms2300 -Xmx2300 에서만 일관되게 시작되도록 할 수 있었습니다 . 그런 다음 지원을 통해 이에 대해 조언을 받았습니다.

Linux에서 32 비트 프로세스는 주소 지정 가능한 최대 주소 공간이 3GB (3072mb) 인 반면 Solaris에서는 전체 4GB (4096mb)입니다.


지원이 제공하는 대답의 이유는 프로세스에 사용할 수있는 주소 지정 가능 메모리의 양에 있습니다. 이것은 Linux 커널 및 하드웨어에 따라 다릅니다. 이론적으로 주소 지정 가능한 메모리는 2 ^ 32 = 4G로 제한됩니다 (Java 힙 크기는 이보다 작습니다). 그러나 이것은 (이론적으로) hugemem 및 PAE를 사용하여 확장 될 수 있습니다. 나는 이것을 시도하지 않았다.
Vineet Reynolds 2011

9

64 비트 OS에서 32 비트 JVM의 제한은 32 비트 OS에서 32 비트 JVM의 제한과 정확히 동일합니다. 결국 32 비트 JVM은 32 비트 가상 머신 (가상화 의미에서)에서 실행되므로 64 비트 OS / 머신에서 실행되고 있는지 알 수 없습니다.

32 비트 OS에 비해 64 비트 OS에서 32 비트 JVM을 실행할 때의 한 가지 장점은 더 많은 물리적 메모리를 가질 수 있으므로 스왑 / 페이징 빈도가 줄어든다는 것입니다. 그러나 이러한 이점은 여러 프로세스가있을 때만 완전히 실현됩니다.


1
하드웨어 및 가상화 방식에 따라 약간의 차이가있을 수 있습니다. 4GB 주소 지정 가능 공간 중 일부는 일반적으로 메모리 매핑 된 장치에 사용됩니다. 가상화 계층은 시스템의 물리적 장치와 동일한 메모리 공간을 가질 수도 있고 그렇지 않을 수도 있습니다.
Eric J.

8
좀 빠지는. 32 비트 주소 공간을 운영 체제 또는 하드웨어 인터페이스와 공유 할 필요가 없기 때문에 64 비트 시스템에서 JVM을위한 공간이 더 많습니다.
Thorbjørn Ravn Andersen

그것은 사실이지만 32 비트 가상 머신이 32 비트 실제 머신과 약간 다른 오버 헤드를 가질 수 있다는 것을 의미합니다 (더 나쁘거나 더 나음). 어느 쪽이든, 32 비트 머신 (실제 또는 가상)에서 JVM을 실행하고 있으므로 표준 32 비트 제약 조건이 적용됩니다. 즉 : 4GB의 절대 한도.
Laurence Gonsalves

Thorbjørn : 운영 체제 및 하드웨어 인터페이스는 여전히 32 비트 VM에 매핑되어야합니다. 들리는 정확한 양은 다를 수 있지만 여전히 존재합니다. 64 비트 OS에서 가상화 할 수 있다면 32 비트 OS에서 가상화하는 것을 막을 수있는 방법은 무엇입니까? 이것은 우리가 말하는 가상 메모리입니다.
Laurence Gonsalves

2
LG : 원래 답변에 동의하지 않습니다. OS 커널과 그것이 매핑하는 모든 HW 및 버스 주소 공간은 많은 주소 공간을 차지할 것이며 이것이 사용자 프로그램에 매핑되지는 않지만 OS가 스스로 설정 한 후 "남은"양을 줄입니다. 이것은 상당한 양의 4GB 32 비트 공간입니다. 전통적으로 이것은 4GB의 약 25 % -75 %를 사용자 프로세스에서 사용할 수 없음을 의미합니다. :-) 커널 해커
DigitalRoss

6

64 비트 대신 32 비트 JVM을 사용하는 이유는 기술적 인 것이 아니라 관리 / 관료적입니다.

BEA에서 일할 때 평균적인 응용 프로그램이 실제로 느리게 실행 되는 것을 발견했습니다. 64 비트 JVM에서 했고, 32 비트 JVM에서 실행할 때 . 어떤 경우에는 성능 저하가 25 %까지 느려졌습니다. 따라서 애플리케이션에 추가 메모리가 모두 필요하지 않는 한 32 비트 서버를 더 많이 설정하는 것이 좋습니다.

내가 회상했듯이, BEA 전문 서비스 직원이 만난 64 비트 사용에 대한 가장 일반적인 세 ​​가지 기술적 이유는 다음과 같습니다.

  1. 애플리케이션은 여러 개의 거대한 이미지를 조작하고 있었지만
  2. 응용 프로그램은 엄청난 수의 처리를하고있었습니다.
  3. 응용 프로그램에 메모리 누수가 있었고 고객은 정부 계약에서 전성기였으며 메모리 누수를 추적하는 데 시간과 비용을 들이고 싶지 않았습니다. (대량 메모리 힙을 사용하면 MTBF가 증가하고 프라임은 여전히 ​​지불됩니다)

.


즉 좋은 당신이 먼저 손 조언, BEA의 전 직원 : 제공하다
emecas

4

현재 Oracle이 소유하고있는 JROCKIT JVM은 비 연속적인 힙 사용을 지원하므로 JVM이 64 비트 Windows OS에서 실행 중일 때 32 비트 JVM이 3.8GB 이상의 메모리에 액세스 할 수 있습니다. (32 비트 OS에서 실행하는 경우 2.8GB).

http://blogs.oracle.com/jrockit/entry/how_to_get_almost_3_gb_heap_on_windows

JVM은 다음 사이트에서 무료로 다운로드 할 수 있습니다 (등록 필요).

http://www.oracle.com/technetwork/middleware/jrockit/downloads/index.html


4

다음은 Solaris 및 Linux 64 비트에서 몇 가지 테스트입니다.

Solaris 10-SPARC-32GB RAM (약 9GB 여유 공간)이있는 T5220 시스템

$ java -XX:PermSize=128M -XX:MaxPermSize=256M -Xms512m -Xmx3750m MaxMemory
Error occurred during initialization of VM
Could not reserve space for ObjectStartArray
$ java -XX:PermSize=128M -XX:MaxPermSize=256M -Xms512m -Xmx3700m MaxMemory
Total Memory: 518520832 (494.5 MiB)
Max Memory:   3451912192 (3292.0 MiB)
Free Memory:  515815488 (491.91998291015625 MiB)
Current PID is: 28274
Waiting for user to press Enter to finish ...

$ java -version
java version "1.6.0_30"
Java(TM) SE Runtime Environment (build 1.6.0_30-b12)
Java HotSpot(TM) Server VM (build 20.5-b03, mixed mode)

$ which java
/usr/bin/java
$ file /usr/bin/java
/usr/bin/java: ELF 32-bit MSB executable SPARC Version 1, dynamically linked, not stripped, no debugging information available

$ prstat -p 28274
   PID USERNAME  SIZE   RSS STATE  PRI NICE      TIME  CPU PROCESS/NLWP
28274 user1     670M   32M sleep   59    0   0:00:00 0.0% java/35

BTW : 분명히 Java는 시작시 실제 메모리를 많이 할당하지 않습니다. 시작된 인스턴스 당 약 100MB 만 소요되는 것 같습니다 (10 개 시작)

Solaris 10-x86-8GB RAM이있는 VMWare VM (약 3GB 여유 공간 *)

3GB 여유 RAM은 사실이 아닙니다. ZFS 캐시가 사용하는 많은 RAM이 있지만 정확히 얼마나 많은지 확인할 수있는 루트 액세스 권한이 없습니다.

$ java -XX:PermSize=128M -XX:MaxPermSize=256M -Xms512m -Xmx3650m MaxMemory
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.

$ java -XX:PermSize=128M -XX:MaxPermSize=256M -Xms512m -Xmx3600m MaxMemory
Total Memory: 516423680 (492.5 MiB)
Max Memory:   3355443200 (3200.0 MiB)
Free Memory:  513718336 (489.91998291015625 MiB)
Current PID is: 26841
Waiting for user to press Enter to finish ...

$ java -version
java version "1.6.0_41"
Java(TM) SE Runtime Environment (build 1.6.0_41-b02)
Java HotSpot(TM) Server VM (build 20.14-b01, mixed mode)

$ which java
/usr/bin/java

$ file /usr/bin/java
/usr/bin/java:  ELF 32-bit LSB executable 80386 Version 1 [FPU], dynamically linked, not stripped, no debugging information available

$ prstat -p 26841
   PID USERNAME  SIZE   RSS STATE  PRI NICE      TIME  CPU PROCESS/NLWP
26841 user1     665M   22M sleep   59    0   0:00:00 0.0% java/12

RedHat 5.5-x86-4GB RAM이있는 VMWare VM (약 3.8GB 사용-버퍼에 200MB, 캐시에 3.1GB이므로 약 3GB 여유 공간)

$ alias java='$HOME/jre/jre1.6.0_34/bin/java'

$ java -XX:PermSize=128M -XX:MaxPermSize=256M -Xms512m -Xmx3500m MaxMemory
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.

$ java -XX:PermSize=128M -XX:MaxPermSize=256M -Xms512m -Xmx3450m MaxMemory
Total Memory: 514523136 (490.6875 MiB)
Max Memory:   3215654912 (3066.6875 MiB)
Free Memory:  511838768 (488.1274871826172 MiB)
Current PID is: 21879
Waiting for user to press Enter to finish ...

$ java -version
java version "1.6.0_34"
Java(TM) SE Runtime Environment (build 1.6.0_34-b04)
Java HotSpot(TM) Server VM (build 20.9-b04, mixed mode)

$ file $HOME/jre/jre1.6.0_34/bin/java
/home/user1/jre/jre1.6.0_34/bin/java: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.2.5, dynamically linked (uses shared libs), for GNU/Linux 2.2.5, not stripped

$ cat /proc/21879/status | grep ^Vm
VmPeak:  3882796 kB
VmSize:  3882796 kB
VmLck:         0 kB
VmHWM:     12520 kB
VmRSS:     12520 kB
VmData:  3867424 kB
VmStk:        88 kB
VmExe:        40 kB
VmLib:     14804 kB
VmPTE:        96 kB

JRE 7을 사용하는 동일한 시스템

$ alias java='$HOME/jre/jre1.7.0_21/bin/java'

$ java -XX:PermSize=128M -XX:MaxPermSize=256M -Xms512m -Xmx3500m MaxMemory
Error occurred during initialization of VM
Could not reserve enough space for object heap
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

$ java -XX:PermSize=128M -XX:MaxPermSize=256M -Xms512m -Xmx3450m MaxMemory
Total Memory: 514523136 (490.6875 MiB)
Max Memory:   3215654912 (3066.6875 MiB)
Free Memory:  511838672 (488.1273956298828 MiB)
Current PID is: 23026
Waiting for user to press Enter to finish ...

$ java -version
java version "1.7.0_21"
Java(TM) SE Runtime Environment (build 1.7.0_21-b11)
Java HotSpot(TM) Server VM (build 23.21-b01, mixed mode)

$ file $HOME/jre/jre1.7.0_21/bin/java
/home/user1/jre/jre1.7.0_21/bin/java: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped

$ cat /proc/23026/status | grep ^Vm
VmPeak:  4040288 kB
VmSize:  4040288 kB
VmLck:         0 kB
VmHWM:     13468 kB
VmRSS:     13468 kB
VmData:  4024800 kB
VmStk:        88 kB
VmExe:         4 kB
VmLib:     10044 kB
VmPTE:       112 kB

우리가 놓친 플랫폼에 대한 유용한 테스트 결과가 여기에 있습니다. 파일 및 메모리 덤프 사용도 잘 작동합니다.
mike

3

훨씬 나아질 것

64 비트 호스트에서 실행되는 32 비트 JVM의 경우 힙에 남은 것은 JVM, 자체 DLL 및 OS 32 비트 호환성 항목이로드 된 후 사용할 수있는 조각화되지 않은 가상 공간이 될 것입니다. 거친 추측으로 나는 3GB가 가능해야한다고 생각하지만 32 비트 호스트 랜드에서 얼마나 잘하고 있는지에 따라 얼마나 더 나은가에 달려 있습니다.

또한 거대한 3GB 힙을 만들 수 있다고해도 GC 일시 중지가 잠재적으로 문제가 될 수 있으므로 원하지 않을 수 있습니다. 어떤 사람들은 하나의 거대한 메모리가 아닌 여분의 메모리를 사용하기 위해 더 많은 JVM을 실행합니다. 나는 그들이 거대한 힙으로 더 잘 작동하도록 JVM을 지금 조정하고 있다고 생각합니다.

얼마나 더 잘할 수 있는지 정확히 아는 것은 약간 어렵습니다. 32 비트 상황은 실험을 통해 쉽게 확인할 수 있다고 생각합니다. 특히 32 비트 호스트에서 사용 가능한 가상 공간이 다소 제한되어 있기 때문에 추상적으로 예측하기는 어렵습니다. 힙은 인접한 가상 메모리에 있어야하므로 주소 공간의 단편화가 필요합니다. dll 및 OS 커널에 의한 주소 공간의 내부 사용은 가능한 할당 범위를 결정합니다.

OS는 HW 장치를 매핑하기 위해 일부 주소 공간을 사용하고 자체 동적 할당을 사용합니다. 이 메모리는 자바 프로세스 주소 공간에 매핑되지 않지만 OS 커널은이 메모리와 주소 공간에 동시에 액세스 할 수 없으므로 모든 프로그램의 가상 공간 크기를 제한합니다.

DLL로드는 JVM의 구현 및 릴리스에 따라 다릅니다. OS 커널로드는 엄청난 수의 것, 릴리스, HW, 마지막 재부팅 이후 지금까지 매핑 된 것의 수, 누가 알 수 있는지에 따라 달라집니다.

요약해서 말하자면

32 비트에서는 1-2GB, 64 비트에서는 약 3GB를 얻을 수 있으므로 전체적으로 약 2 배 향상되었습니다 .


1
불행히도 Xmx 플래그를 실험 할 수있는 64 비트 환경이 없습니다. 내가 아는 것은 엄청난 (32 * n) GB의 RAM을 사용할 수 있지만 범위를 벗어났습니다. 이것이 32 비트 세계에서 일반적으로 직면하는 모든 제약없이 32 비트 JVM이 어떻게 작동하는지 알고 싶었던 이유입니다.
Vineet Reynolds

음, 좋은 질문입니다. 기본적인 대답은 "더 잘 작동 할 것입니다"라고 확신합니다.
DigitalRoss

네, 실제 질문에 좀 더 초점을 맞추기 위해 제 답변을 편집했습니다. :-)
DigitalRoss

1
≅ 64 비트의 3GB 사운드가 거의 맞습니다. Thorbjørn은 이론적으로 4GB를 초과 할 수없는 이유를 이미 밝혔습니다. 안타깝게도 두 가지 대답을 받아 들일 수 없습니다.
Vineet Reynolds

상자 가있는 경우 가상 상자 (최고의 Solaris 게스트 지원을 제공하는)에서 64 비트 Solaris를 실험 할 수 있습니다.
Thorbjørn Ravn Andersen

2

Solaris에서 제한은 Solaris 2.5 이후 약 3.5GB였습니다. (약 10 년 전)


Oracle Solaris Express 11을 사용하여 실험 해 보겠습니다.
djangofan 2011-08-25

1
@Peter Lawrey Uhm .. Solaris 2.5는 1996 년 5 월의 릴리스 날짜를 고려하면 거의 20 년 전이었습니다. ... 물론 2005 년까지 EOL되지 않았습니다.
cb88

1

Android Blocks Editor 용 App Inventor에서 사용하는 JVM에서 동일한 문제가 발생했습니다. 힙을 최대 925m로 설정합니다. 이것만으로는 충분하지 않지만 내 컴퓨터의 다양한 무작위 요인에 따라 약 1200m 이상 설정할 수 없었습니다.

Firefox에서 베타 64 비트 브라우저 인 Nightly와 JAVA 7 64 비트 버전을 다운로드했습니다.

새 힙 한계를 아직 찾지 못했지만 힙 크기가 5900m 인 JVM을 방금 열었습니다. . 문제 없어요!

24GB RAM이있는 컴퓨터에서 Win 7 64 비트 Ultimate를 실행하고 있습니다.


0

32 비트 Linux 시스템에서 힙 크기를 최대 2200M으로 설정하려고 시도했으며 JVM이 제대로 작동했습니다. 2300M으로 설정했을 때 JVM이 시작되지 않았습니다.


Windows VISTA 64 비트에서 32 비트 JVM은 최대 1582m (-Xmx 값)에 추가 할 것이라고 생각했습니다. 내가 1583m를 지정하면 불평합니다. 이 값이 기계에서 기계로 바뀌는 지 모르겠습니다. 이것을 테스트 한 컴퓨터에는 실제로 4GB의 물리적 RAM이 있습니다.
Santosh Tiwari 2011 년

@SantoshTiwari 그것은 기계에서 기계로 변화하지만 여기에 이유가 있습니다
Eugene


0

핫스팟 32 비트 JVM에 대한 한 가지 추가 사항 :-기본 힙 용량 = 4Gig – Java 힙-PermGen;

Java 힙과 네이티브 힙이 경쟁에 있기 때문에 32 비트 JVM에서는 특히 까다로울 수 있습니다. Java 힙이 클수록 네이티브 힙은 작아집니다. 32 비트 VM 용 대용량 힙 (예 : .2.5GB +)을 설정하려고하면 애플리케이션 풋 프린트, 스레드 수 등에 따라 기본 OutOfMemoryError 위험이 증가합니다.


0

제한은 또한 32 bitVM의 heap경우 모든 .NET Framework를 원한다면 주소 0에서 시작 해야한다는 사실에서도 비롯됩니다 4GB.

다음을 통해 무언가를 참조하고 싶다면 생각해보십시오.

0000....0001

즉 :이 특정 비트 표현이있는 참조는 힙에서 첫 번째 메모리에 액세스하려고한다는 것을 의미합니다. 이를 위해 힙은 주소 0에서 시작해야합니다. 그러나 그것은 결코 일어나지 않으며 0에서 약간의 오프셋에서 시작됩니다.

    | ....               .... {heap_start .... heap_end} ... |
 --> (this can't be referenced) <--

힙은의 주소 0에서 시작하지 않기 때문에 비트 참조 OS에서 사용되지 않는 비트가 상당히 32많으며 참조 할 수있는 힙은 더 낮습니다.


-1

이론적 4GB이지만 실제로는 IBM JVM의 경우 :

Win 2k8 64, IBM Websphere Application Server 8.5.5 32 비트

C:\IBM\WebSphere\AppServer\bin>managesdk.bat -listAvailable -verbose CWSDK1003I: Доступные SDK: CWSDK1005I: Имя SDK: 1.6_32 - com.ibm.websphere.sdk.version.1.6_32=1.6 - com.ibm.websphere.sdk.bits.1.6_32=32 - com.ibm.websphere.sdk.location.1.6_32=${WAS_INSTALL_ROOT}/java - com.ibm.websphere.sdk.platform.1.6_32=windows - com.ibm.websphere.sdk.architecture.1.6_32=x86_32 - com.ibm.websphere.sdk.nativeLibPath.1.6_32=${WAS_INSTALL_ROOT}/lib/native/win /x86_32/ CWSDK1001I: Задача managesdk выполнена успешно. C:\IBM\WebSphere\AppServer\java\bin>java -Xmx2036 MaxMemory JVMJ9GC017E -Xmx слишком мала, должна быть не меньше 1 M байт JVMJ9VM015W Ошибка инициализации для библиотеки j9gc26(2): Не удалось инициализи ровать Could not create the Java virtual machine. C:\IBM\WebSphere\AppServer\java\bin>java -Xmx2047M MaxMemory Total Memory: 4194304 (4.0 MiB) Max Memory: 2146435072 (2047.0 MiB) Free Memory: 3064536 (2.9225692749023438 MiB) C:\IBM\WebSphere\AppServer\java\bin>java -Xmx2048M MaxMemory JVMJ9VM015W Ошибка инициализации для библиотеки j9gc26(2): Не удалось создать эк земпляр кучи; запрошено 2G Could not create the Java virtual machine.

RHEL 6.4 64, IBM Websphere Application Server 8.5.5 32 비트

[bin]./java -Xmx3791M MaxMemory Total Memory: 4194304 (4.0 MiB) Max Memory: 3975151616 (3791.0 MiB) Free Memory: 3232992 (3.083221435546875 MiB) [root@nagios1p bin]# ./java -Xmx3793M MaxMemory Total Memory: 4194304 (4.0 MiB) Max Memory: 3977248768 (3793.0 MiB) Free Memory: 3232992 (3.083221435546875 MiB) [bin]# /opt/IBM/WebSphere/AppServer/bin/managesdk.sh -listAvailable -verbose CWSDK1003I: Available SDKs : CWSDK1005I: SDK name: 1.6_32 - com.ibm.websphere.sdk.version.1.6_32=1.6 - com.ibm.websphere.sdk.bits.1.6_32=32 - com.ibm.websphere.sdk.location.1.6_32=${WAS_INSTALL_ROOT}/java - com.ibm.websphere.sdk.platform.1.6_32=linux - com.ibm.websphere.sdk.architecture.1.6_32=x86_32 -com.ibm.websphere.sdk.nativeLibPath.1.6_32=${WAS_INSTALL_ROOT}/lib/native/linux/x86_32/ CWSDK1001I: Successfully performed the requested managesdk task.

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