Java 어레이의 프리미티브는 스택 또는 힙에 저장되어 있습니까?
다음과 같은 어레이 선언이 있습니다.
int a[];
여기서a원시적인 배열입니다.inttype. 이 어레이는 어디에 저장됩니까?히프 또는 스택에 저장되어 있습니까?이 타입은 프라이머리 타입입니다.int일부 프리미티브타입은 힙에 저장되지 않습니다.
구루쿨키 말처럼, 그것은 더미 위에 보관되어 있다.하지만 당신의 글은 아마도 선의의 어떤 사람이 "원본은 항상 스택 위에 산다"는 속설을 퍼뜨리고 있기 때문에 오해를 불러일으켰습니다.사실이 아닙니다.로컬 변수의 값은 스택에 있지만 모든 원시 변수가 로컬인 것은 아닙니다.
예를 들어 다음과 같습니다.
public class Foo
{
int value;
}
...
public void someOtherMethod()
{
Foo f = new Foo();
...
}
자, 어디서?f.value라이브요? 신화상으로는 스택에 있는 것 같지만 실제로는 새로운 기능의 일부입니다.Foo오브젝트 및 힙 상에1 존재합니다.(의 값은f그 자체가 참조이며 스택에 존재합니다.)
그 후 어레이는 간단하게 실행할 수 있습니다.어레이는 단순히 변수가 많다고 생각할 수 있습니다.new int[3]이 형식의 클래스가 있는 것 같습니다.
public class ArrayInt3
{
public readonly int length = 3;
public int value0;
public int value1;
public int value2;
}
1 사실, 이건 이것보다 더 복잡해요.스택/히프의 구별은 대부분 구현 세부사항입니다.아마 실험적인 JVM 중에는 오브젝트가 메서드에서 이스케이프되지 않는 타이밍을 알 수 있고 오브젝트 전체를 스택에 할당할 수 있는 것이 있습니다.하지만, 당신이 신경 쓰기를 원한다면, 개념적으로 그것은 산더미 위에 있다.
힙에 저장됩니다.
어레이는 Java의 객체이기 때문입니다.
편집 : 있는 경우
int [] testScores;
testScores = new int[4];
이 코드가 컴파일러에게 "4개의 int를 보유하는 배열 개체를 만들고, 이를 참조 변수에 할당합니다.testScores또, 각각의 설정을 실시해 주세요.int요소를 0으로 설정합니다.감사합니다.
그것은 그 자체로 원시적이지 않은 원시적인 유형들의 배열이다.새로운 키워드가 포함되어 있는 경우, 결과는 히프에 표시됩니다.
이 주제에 대해 몇 가지 테스트를 실시했습니다.
1,000만 사이즈 어레이
public static void main(String[] args) {
memInfo();
double a[] = new double[10000000];
memInfo();
}
출력:
------------------------
max mem = 130.0 MB
total mem = 85.0 MB
free mem = 83.6 MB
used mem = 1.4 MB
------------------------
------------------------
max mem = 130.0 MB
total mem = 130.0 MB
free mem = 48.9 MB
used mem = 81.1 MB
------------------------
보시는 바와 같이 사용된 힙 크기는 최대 80MB 증가하며, 이는 10m * size of(더블)입니다.
하지만 더블 대신 더블을 사용하면
public static void main(String[] args) {
memInfo();
Double a[] = new Double[10000000];
memInfo();
}
출력은 40MB로 표시됩니다.이중 참조만 있고 초기화되지 않았습니다.
이중으로 채우다
public static void main(String[] args) {
memInfo();
Double a[] = new Double[10000000];
Double qq = 3.1d;
for (int i = 0; i < a.length; i++) {
a[i] = qq;
}
memInfo();
}
아직 40MB.모두 동일한 이중 개체를 가리키기 때문입니다.
대신 double로 초기화
public static void main(String[] args) {
memInfo();
Double a[] = new Double[10000000];
Double qq = 3.1d;
for (int i = 0; i < a.length; i++) {
a[i] = qq.doubleValue();
}
memInfo();
}
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
선
a[i] = qq.doubleValue();
와 동등하다
a[i] = Double.valueOf(qq.doubleValue());
와 동등하다.
a[i] = new Double(qq.doubleValue());
매번 새로운 Double Object를 작성하기 때문에 힙을 삭제합니다.이것은 Double 클래스 내의 값이 힙에 저장되어 있음을 나타냅니다.
Java 프로그래밍에서 언어 배열은 객체이며 동적으로 생성되며 객체 유형의 변수에 할당될 수 있습니다.
http://java.sun.com/docs/books/jls/second_edition/html/arrays.doc.html
두 가지 관점이 있는 것 같아요. 이런 걸 할 때
int arr[] = new int[4];
for( int i=0;i<=3;i++ ){
arr[i] = i*10;
}
배열은 힙에 저장되고 참조 아리아블 "arr"만 스택에 저장됩니다. 이런 거 할 int arr[] = {10,20,30,40,50}; 모든 됩니다.
언급URL : https://stackoverflow.com/questions/2099695/is-a-java-array-of-primitives-stored-in-stack-or-heap
'source' 카테고리의 다른 글
| x64 Java에서 int보다 긴 이유는 무엇입니까? (0) | 2022.11.02 |
|---|---|
| 정수를 int로 변환하는 방법 (0) | 2022.11.02 |
| URL과 일치시키는 데 적합한 정규 표현은 무엇입니까? (0) | 2022.11.02 |
| 결과가 없더라도 값 반환 (0) | 2022.11.02 |
| Java String의 Unicode 코드 포인트를 반복하려면 어떻게 해야 합니까? (0) | 2022.11.02 |