我有一个基于Spring的Java Web应用程序,它可以在Mongo DB的帮助下处理大数据。我的应用程序的一个功能是将大量数据导出到xls / csv。我在db中有大约550万条记录,我想将它们导出到xls。单个xls文件支持的最大行数约为100万。因此,最初我计划创建5-6个文件,每个文件有100万条记录。
然而,在从数据库中提取数据之后,我在处理大量没有创建的Java对象时出现了内存不足的问题。每个此对象将对应于xls中的一行。
由于此应用程序可以安装在具有不同内存大小的不同服务器上。我想预测什么是安全的没有对象我可以导出到excel文件而不会导致内存不足异常。总之,我想实现下面提到的公式:
No of objects to be exported = (Heap space available - some Buffer)/ Size occupied by single obejct
我如何实现这一目标?
答案 0 :(得分:1)
您可以通过以下方式查找对象数量。
1)使用 Runtime.getRuntime()。freeMemory()找到可用堆空间,如下所示:
long freeMemory=Runtime.getRuntime().freeMemory();
2)定义一个类来获取单个对象的大小。使用java的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);