控制或预测JVM堆大小

时间:2017-09-22 09:03:48

标签: java jvm spring-data-jpa heap-memory

我有一个基于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

我如何实现这一目标?

1 个答案:

答案 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);