2017-09-22 1 views
0

Mongo DB를 사용하여 큰 데이터를 처리하는 Spring 기반 Java 웹 응용 프로그램이 있습니다. 내 응용 프로그램의 한 기능은 많은 양의 데이터를 xls/csv로 내보내는 것입니다. 나는 약 550 만 레코드를 가지고 있고 그것을 xls로 내보내고 싶다. 단일 xls 파일에서 지원하는 최대 행 수는 약 1 백만 개입니다. 그래서 처음에는 1 백만 개의 레코드가있는 5-6 개의 파일을 만들 계획이었습니다.JVM 힙 크기 제어 또는 예측

그러나 데이터베이스에서 데이터를 추출한 후에 대량의 Java 객체를 처리하는 동안 메모리 예외가 발생합니다. 이 객체는 각각 xls의 한 행에 해당합니다.

이 앱은 메모리 크기가 다른 여러 서버에 설치할 수 있으므로 나는 메모리 예외가 발생하지 않고 파일을 엑셀로 내보낼 수있는 객체의 안전성을 예측하고 싶습니다. 요컨대 아래에 언급 한 수식을 구현하고 싶습니다.

No of objects to be exported = (Heap space available - some Buffer)/ Size occupied by single obejct 

어떻게해야합니까?

답변

1

아래의 방법으로 개체 수를 확인할 수 있습니다.

1) Runtime.getRuntime를 사용 사용할 수있는 힙 공간()을 찾을 수 freeMemory에서() 아래 :.

long freeMemory=Runtime.getRuntime().freeMemory(); 

2) 단일 개체의 크기를 얻을 수있는 클래스를 정의합니다. 아래와 같은 자바의 Intrumentation 인터페이스를 사용하여 :

public class InstrumentationAgent { //create a **InstrumentationAgent** class 

     private static Instrumentation instrumentation; 

     public static void premain(String args, Instrumentation inst) { 
     instrumentation = inst; 
     } 

     public static long getObjectSize(Object o) { 
     return instrumentation.getObjectSize(o); 
     } 
    } 

클래스 추가하는 파일 참고하십시오 :

Premain-class: some.package.InstrumentationAgent // Add the **InstrumentationAgent** class to your manifest file 

3) 그리고 지금 버퍼 크기를 정의하고 다음과 같이 객체의 수를 얻을 :

long freeMemory=Runtime.getRuntime().freeMemory(); 
long singleObjectSize=InstrumentationAgent.getObjectSize(new Object()); 
int numberOfObject= (int)((freeMemory-defaultBufferSize)/singleObjectSize); 
+1

감사합니다 Raju! 이것은 크게 도움이되었습니다. –

+0

참고 : 사용 가능한 메모리 크기는 전체 GC 후에 만 ​​의미가 있습니다. 그 전에는 정리 될 수 있지만 GC가 실행되지 않았던 개체가 있기 때문에 더 낮아질 것입니다. –

관련 문제