2016-08-10 3 views
2

IDE 사용 된 파일 : Netbeans 8.1.예외 java.lang.OutOfMemoryError : Java 힙 공간

MySQL 데이터베이스에서 큰 데이터 읽기. 코드를 실행하는 동안 오류를 얻고있다

List outer=new ArrayList<String>(); 
List inner=new ArrayList<String>(); 
Connection con; 
Statement stmt; 
ResultSet rs; 
ResultSetMetaData rsmd; 
int columnNumber; 
try{ 
    Class.forName("com.mysql.jdbc.Driver"); 
    con=DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb","root","root"); 
    stmt=con.createStatement(); 
    rs=stmt.executeQuery("select * from mytable where srno<1000"); 
    rsmd=rs.getMetaData(); 
    columnNumber=rsmd.getColumnCount(); 
    while(rs.next()){ 
     for(int i=1;i<columnNumber;i++){ 
      inner.add(rs.getString(i)); 
     } 
     outer.add(inner); 
    }   
    System.out.println("\t" + outer); 
    rs.close(); 
    con.close(); 
}catch(Exception e){ 
    System.out.println(e); 
} 

: Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

내가 속성에서 VM 옵션을 설정하려고했습니다를>> VM 옵션 실행 : 내가 -Xmx1024m

다음은 내 코드입니다 여전히 같은 오류가 발생합니다. 어떻게 해결합니까?

+0

더 작은 테이블을 쿼리하거나 WHERE 절을 사용하여 얼마나 많은 데이터가 반환되는지 제한하십시오. 더 많은 RAM을 가진 64 비트 JVM을 실행하십시오. 그게 당신이 할 수있는 전부입니다. – duffymo

+0

해냈어. 하지만 여전히 같은 오류가 발생합니다. –

+0

선택 결과에 대한 자세한 정보 : 행 수? 얼마나 많은 칸이 있니? 각 열 내용의 평균 크기? – Aris2World

답변

4

그냥이 코드를보고 : 테이블의 각 행에 대해

while(rs.next()){ 
    for(int i=1;i<columnNumber;i++){ 
     inner.add(rs.getString(i)); 
    } 
    outer.add(inner); 
    } 

, 당신은 각 열 목록에 값과 다른 목록에 추가하고 해당 목록의 각 추가됩니다. 따라서 테이블에 100 만 개의 행이 있고 각 행에 5 개의 열이있는 경우 5 백만 행을 생성 중입니다. 기억이 고갈되고 있다는 것은 놀랍습니까? 귀하의 업데이트에 따르면 그것은 실제로 1 천만 행과 45 열입니다. 당신은 4 억 5 천만 개의 물건을 만들고 있다는 것을 알고 있습니까?

외부 목록의 각 항목은 개체 머리글 및 기타 항목으로 인해 데이터베이스에서 사용 된 공간보다 많은 공간을 차지합니다.

예를 들어 스윙 앱의 경우이 기능을 설명 했으므로 적합한 테이블 모델을 선택하고 전체 db를 메모리에 한 번에로드하지 않아도됩니다.

+0

오, 내 실수. 나는 전체 행을 목록에 저장하고 싶었고 여러 행이 있기 때문에이 방법으로 그랬습니다. –

+3

완전히 다른 전략이 필요합니다. – e4c5

+3

@ e4c5에 동의합니다. db (Lazy List 또는 Paginated List)에서 읽는 동안 데이터를 사용해야합니다. 잠재적 인 무제한 데이터 소스에서 메모리 데이터를로드하는 것은 결코 좋은 전략이 아닙니다. – Aris2World

관련 문제