좋아, 그래서 자바에서이 작은 실험을하려고합니다. 정수로 큐를 채우고 소요 시간을 확인하고 싶습니다.Java가 예상보다 많은 메모리를 사용합니다.
import java.io.*;
import java.util.*;
class javaQueueTest {
public static void main(String args[]){
System.out.println("Hello World!");
long startTime = System.currentTimeMillis();
int i;
int N = 50000000;
ArrayDeque<Integer> Q = new ArrayDeque<Integer>(N);
for (i = 0;i < N; i = i+1){
Q.add(i);
}
long endTime = System.currentTimeMillis();
long totalTime = endTime - startTime;
System.out.println(totalTime);
}
}
OK, 그래서 나는 이것을 실행하고 5 개 천만 정수 나쁜 아닌
Hello World!
12396
약 12 초를 얻을 : 여기에 간다. 하지만 7 천만 개의 정수를 실행하려고하면 다음과 같이 나타납니다.
Hello World!
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.lang.Integer.valueOf(Integer.java:642)
at javaQueueTest.main(javaQueueTest.java:14)
이 메시지가 표시되는 데 약 10 분이 걸립니다. 흠. 그래서 만약 내가 힙에 대한 나의 모든 기억 (8gigs)을 주면 어떨까? 그래서 7GB의 힙 크기로 실행하지만 여전히 동일한 오류가 발생합니다.
javac javaQueueTest.java
java -cp . javaQueueTest -Xmx7g
Hello World!
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.lang.Integer.valueOf(Integer.java:642)
at javaQueueTest.main(javaQueueTest.java:14)
두 가지를 묻고 싶습니다. 첫째, 오류가 발생하는 데 너무 오래 걸립니까? 둘째, 이 메모리가 충분하지 않은 이유는 무엇입니까?? C에서 3 억 개의 정수를 동일한 실험으로 실행하면 (glib g_queue와 함께) 컴퓨터가 많이 느려지 긴하지만 10 초 이내에 실행할 수 있습니다. 따라서 정수의 수가 잘못되지 않아야합니다. 내가 컴파일하고 결과를 얻을
#include<stdlib.h>
#include<stdio.h>
#include<math.h>
#include<glib.h>
#include<time.h>
int main(){
clock_t begin,end;
double time_spent;
GQueue *Q;
begin = clock();
Q = g_queue_new();
g_queue_init(Q);
int N = 300000000;
int i;
for (i = 0; i < N; i = i+1){
g_queue_push_tail(Q,GINT_TO_POINTER(i));
}
end = clock();
time_spent = (double)(end - begin)/CLOCKS_PER_SEC;
printf("elapsed time: %f \n",time_spent);
}
:
try{
ArrayDeque<Integer> Q = new ArrayDeque<Integer>(N);
for (i = 0;i < N; i = i+1){
Q.add(i);
}
}
catch(OutOfMemoryError e){
Q=null;
System.gc();
System.err.println("OutOfMemoryError: "+i);
}
: 당신이 OutOfMemoryError를 잡을 수
gcc cQueueTest.c `pkg-config --cflags --libs glib-2.0 gsl ` -o cQueueTest
~/Desktop/Software Development/Tests $ ./cQueueTest
elapsed time: 13.340000
자바 제네릭이 원시 객체가 아닌 정수 객체를 사용한다는 것을 잊지 마십시오. 자바가 각 int에 대해 메모리를 할당해야하기 때문에 속도가 훨씬 느립니다. 또한 기본적으로 Java VM 메모리는 64M이므로 많은 요소를 처리 할 수 있다고 생각하지 않습니다. – gimpycpu
의견 보내 주셔서 감사합니다. 그러나, 나는 실행 명령에 더 많은 메모리를 할당한다 : java -cp. javaQueueTest -Xmx7g, 7gigs로 지정합니다. 그래서 나는 아직도 메모리가 부족한 이유와 에러 메시지를주기 위해 너무 오래 걸리는 이유 (약 10m)를 이해하지 못합니다. 느린 성능, 나는 이해할 수있다. – burnedWood