Java 어레이의 사이즈는 최대입니까?
Java 어레이에 포함할 수 있는 요소의 수에 제한이 있습니까?만약 그렇다면, 과연 무엇인가?
테스트하기 쉬운데도 아직 정답을 못 봤어요.
최근 핫스팟 VM의 정답은 다음과 같습니다.Integer.MAX_VALUE - 5
. 그 이상일 경우:
public class Foo {
public static void main(String[] args) {
Object[] array = new Object[Integer.MAX_VALUE - 4];
}
}
다음과 같은 이점을 얻을 수 있습니다.
Exception in thread "main" java.lang.OutOfMemoryError:
Requested array size exceeds VM limit
이것은(물론) 완전히 VM에 의존합니다.
OpenJDK 7 및 8, , , , , , , 및 의 소스 코드를 참조하면, 다음의 클레임이 반복되고 있는 것을 알 수 있습니다.
/** * Some VMs reserve some header words in an array. * Attempts to allocate larger arrays may result in * OutOfMemoryError: Requested array size exceeds VM limit */ private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
2010년 5월 9일에 Martin Buchholz(Google)에 의해 추가되고 Chris Hegarty(Oracle)에 의해 검토되었습니다.
따라서 최대 "안전한" 숫자는 2 147 483 639라고 할 수 있습니다.Integer.MAX_VALUE - 8
) 및 "더 큰 어레이를 할당하려고 하면 Out Of Memory Error가 발생할 수 있습니다."
(네, Buckholz의 단독 청구에는 뒷받침 증거가 포함되어 있지 않기 때문에 이것은 당국에 대한 계산된 호소입니다.OpenJDK 자체에서도 다음과 같은 코드를 볼 수 있습니다.MAX_ARRAY_SIZE
는 아직 실제로 사용되고 있지 않습니다.)
실제로는 두 가지 제한이 있습니다.하나는 어레이에 인덱스를 붙일 수 있는 최대 요소이고, 다른 하나는 애플리케이션에서 사용할 수 있는 메모리 양입니다.사용 가능한 메모리 용량과 다른 데이터 구조에서 사용되는 양에 따라 주소 지정 가능한 최대 어레이 요소에 도달하기 전에 메모리 한계에 도달할 수 있습니다.
이 기사 http://en.wikipedia.org/wiki/Criticism_of_Java#Large_arrays에 따르면:
Java는 2-131(약 21억) 이상의 요소를 가진 어레이를 지원하지 않는다는 비판을 받아 왔습니다.이는 언어의 제한입니다.Java Language Specification, Section 10.4에는 다음과 같이 기술되어 있습니다.
어레이는 int 값으로 인덱싱해야 합니다...긴 인덱스 값을 사용하여 어레이 구성 요소에 액세스하려고 하면 컴파일 시간 오류가 발생합니다.
대규모 어레이를 지원하려면 JVM을 변경해야 합니다.이 제한은 컬렉션이 20억 요소로 제한되거나 2 GiB보다 큰 맵파일을 메모리 할 수 없는 등의 영역에서 나타납니다.Java는 또한 진정한 다차원 어레이(단일 인터다이렉션을 통해 액세스하는 단일 메모리 블록에 지속적으로 할당됨)가 부족하여 과학 및 기술 컴퓨팅의 성능을 제한합니다.
이 아닌 인덱스로 되어 수는 ""입니다.Integer.MAX_VALUE
다른 하나는 어레이를 얼마나 크게 만들 수 있느냐입니다.은 사용 한 최대 .JVM
을 사용하다각 배열 요소에는 크기가 있습니다. byte = 1 byte
,int = 4 bytes
,Object reference = 4 bytes (on a 32 bit system)
만약에 ★★★★★★★★★★★★★★★★★★★★★★★.1 MB
머신상에서 사용 에서는, 「」의 할 수 .byte[1024 * 1024]
★★★★★★★★★★★★★★★★★」Object[256 * 1024]
질문에 대한 답변 - 크기(사용 가능한 최대 메모리/어레이 항목 크기)의 배열을 할당할 수 있습니다.
개요 - 이론적으로 어레이의 최대 사이즈는Integer.MAX_VALUE
. 달라집니다.JVM
그 중 어느 정도가 이미 다른 오브젝트에 할당되어 있는지 확인합니다.
이렇게 바이트 배열을 생성하려고 했습니다.
byte[] bytes = new byte[Integer.MAX_VALUE-x];
System.out.println(bytes.length);
이 실행 구성의 경우:
-Xms4G -Xmx4G
Java 버전:
Openjdk 버전 "1.8.0_141"
OpenJDK 런타임 환경(빌드 1.8.0_141-b16)
OpenJDK 64비트 서버 VM(빌드 25.141-b16, 혼합 모드)
이 기능은 x > = 2에서만 작동합니다. 즉, 어레이의 최대 크기가 Integer임을 의미합니다.MAX_VALUE-2
위의 값은 다음과 같습니다.
스레드 "main" java.lang에 예외가 있습니다.Out Of Memory Error: 요청된 어레이 크기가 Main.main(Main.java:6)의 VM 제한을 초과합니다.
의 요소의 array
(2^31)−1
★★★★★★★★★★★★★★★★★」2 147 483 647
예, Java 배열에는 제한이 있습니다.Java는 어레이에 대한 인덱스로 정수를 사용하며 JVM에 의한 최대 정수는 2^32이므로 어레이에 2,147,483,647개의 요소를 저장할 수 있습니다.
최대 길이보다 긴 배열을 사용할 수 있지만 파일 내 데이터 저장에는 제한이 없기 때문에 두 배열을 사용하는 것이 좋습니다.스토리지 드라이버에 저장되지만 어레이에 저장되는 파일은 JVM에 저장되기 때문입니다.JVM은 프로그램 실행을 위한 공간을 제한합니다.
2^30-4에서 1073741820을 상한으로 하는 것은 자바 제한입니다.2^31-1이 아닙니다.왜 그랬는지 모르겠지만 나는 jdk에서 수동으로 테스트했다.2^30-3은 다음을 제외하고 여전히 VM을 던집니다.
편집: -1에서 -4로 수정, Windows jvm에서 확인
Java 어레이는 정수 어레이이기 때문에 제한이 있습니다.즉, 어레이에 최대 2,147,483,647개의 요소가 있음을 의미합니다.
언급URL : https://stackoverflow.com/questions/3038392/do-java-arrays-have-a-maximum-size
'programing' 카테고리의 다른 글
#의존관계추적도구 (0) | 2022.07.27 |
---|---|
Java 및 Android 개발에서 WeakReference를 사용하는 방법 (0) | 2022.07.27 |
Vuex 작업 내에서 상태를 직접 조작하는 경우와 'commit' 및 'getters'를 사용하는 경우의 비교 (0) | 2022.07.27 |
Vue Storefront: 옵션 ID 대신 커스텀 속성 필터 라벨 표시 (0) | 2022.07.27 |
Objective-C/iPhone 앱에서 "classic" malloc()/free()를 사용해도 될까요? (0) | 2022.07.27 |