2014-06-12 3 views
-1

클라이언트와 서버 간의 파일 전송을 위해 샘플 프로그램을 다운로드했습니다. 1GB 파일로 프로그램을 실행하려고하면 스레드 "main"의 예외가 발생합니다. java.lang.OutOfMemoryError : Client.main (Client.java:31)의 Java 힙 공간 .Java 메모리 부족 - 힙 크기 초과

편집 : 줄 번호 31 : 바이트 [] mybytearray = 새 바이트 [FILE_SIZE];

public final static int FILE_SIZE = 1097742336; 
// receive file 
     long startTime = System.nanoTime(); 
     byte [] mybytearray = new byte [FILE_SIZE]; 
     InputStream is = sock.getInputStream(); 
     fos = new FileOutputStream(FILE_TO_RECEIVED); 
     bos = new BufferedOutputStream(fos); 
     bytesRead = is.read(mybytearray,0,mybytearray.length); 
     current = bytesRead; 

     do { 
     bytesRead = 
      is.read(mybytearray, current, (mybytearray.length-current)); 
     if(bytesRead >= 0) current += bytesRead; 
     } while(bytesRead > -1); 

     bos.write(mybytearray, 0 , current); 
     bos.flush(); 

수정 사항이 있습니까?

+1

31 줄은 무엇입니까? –

+2

글쎄, 힙에 1GB를 할당하려고합니다. JVM 힙 크기는 얼마로 설정되어 있습니까? – OldProgrammer

+0

이 독립형 자바 프로그램입니까? 프로그램에 더 큰 힙 크기를 제공하려면 -Xmx 매개 변수를 살펴보십시오. – Andrew

답변

1

시도 이 파일의 경우 문제가 발생할 가능성은 여전히 ​​존재합니다. 스트리밍을 살펴볼 수 있습니다.

int count; 
byte[] buffer = new byte[8192]; 
while ((count = inStream.read(buffer)) > 0) 
{ 
    outStream.write(buffer, 0, count); 
} 
1

글쎄, 메모리에 1GB의 파일을 가지고 있다면, 메모리 부족 오류는 이해할 수 있습니다. Java에는 사용 가능한 많은 메모리가 없습니다.

-Xmx 플래그를 사용하면 최대 힙 크기를 설정할 수 있습니다.

-Xmx2000m이어야합니다.

"충분한 공간을 확보 할 수 없습니다"오류가 발생하는 경우 컴퓨터에 사용 가능한 메모리가 부족하다는 의미입니다. 작은 파일을 시험해 보거나 파일을 작은 청크로 나누어 한 번에 하나씩 분석하십시오. 또는 청크로 파일을 읽음으로써 다중 데이터 패킷으로 전송하십시오.

0

는 플래그 -Xmx2G 또는 1G보다 큰 어떤 값을 사용하고 메모리 할당 불황 과거를 얻을 경우에도 다시