我刚刚在我的公司实施了Pentaho并将内存设置为12GB。当我们尝试从一个表加载一个1600万行到另一个表时,它会耗尽内存。
我认为Pentaho在执行数据库提交时会清除内存,但似乎没有发生。当它加载大约250万行时会抛出这个异常,这意味着加载1600万我需要一台73Gb的RAM机器? (当然是粗略的数学)
是否有任何参数或配置可以让魔术发生?这个内存问题限制了我们的负载能力(1600万只是其中一个表)。无法相信Pentaho会在没有最终清除缓存的情况下突然爆发内存。
我的文件D:\ Pentaho \ server \ biserver-ee \ tomcat \ bin \ service.bat包含以下行:
"%EXECUTABLE%" //US//%SERVICE_NAME% ++JvmOptions "-Djava.io.tmpdir=%CATALINA_BASE%\temp;
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager;
-Djava.util.logging.config.file=%CATALINA_BASE%\conf\logging.properties;
-XX:MaxPermSize=256m" --JvmMs 2048 --JvmMx 12288
它与下面的行有什么关系吗?
-XX:MaxPermSize=256m
有人可以解释一下它究竟是什么吗?
提前致谢!
PS:这是我与Pentaho的第一次接触,所以,我很抱歉任何不必要的问题或假设。
答案 0 :(得分:2)
在MaxPermSize开关上,8之前的Oracle Java版本有一个称为permgen(永久代)的内存区域。
有关详细信息,请参阅this答案。
这可能是内存异常的来源,虽然不了解Pentaho和您的使用情况但很难说这是否是您问题的根源。
答案 1 :(得分:0)
某些ETL步骤必须在开始提供结果之前读取(并因此缓存)所有数据(例如,存储组依据,查找流的流查找)。但是如果你只读(表输入)和写(表输出),数据只是进出,你不需要将整个表放入内存(这对于没用,对吧?)。
-JvmMs 2048 -JvmMx 12288参数看起来很可疑。你试过-Xms2g -Xmx12g吗?