orientdb 2.1.11 java进程消耗太多内存

时间:2016-05-04 01:04:48

标签: orientdb

我们正在运行OrientDB 2.1.11(Community Edition)以及JDK 1.8.0.74。

我们注意到'orientdb'java慢慢爬上来的内存消耗,在几天之内,数据库变得无响应(我们必须停止/启动Orientdb以释放内存)。 我们在索引数据库的几个小时内也注意到了这种行为。 数据库的总大小只有60 GB,不超过2亿条记录!

如下所示,它已经消耗了VIRT(11.44 GB)RES(8.62 GB)。

我们正在运行CentOS 7.1.x。

甚至将堆从512更改为256M并将diskcache.bufferSize修改为8GB MAXHEAP = -Xmx256m

ORIENTDB MAXIMUM DISKCACHE,MB,示例,输入-Dstorage.diskCache.bufferSize = 8192 FOR 8GB

MAXDISKCACHE = “ - Dstorage.diskCache.bufferSize = 8192”

最高输出:

Tasks: 155 total,   1 running, 154 sleeping,   0 stopped,   0 zombie 
%Cpu(s):  0.2 us,  0.1 sy,  0.0 ni, 99.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem : 16269052 total,   229492 free,  9510740 used,  6528820 buff/cache
KiB Swap:  8257532 total,  8155244 free,   102288 used.  6463744 avail Mem

PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
2367 nmx      20   0 11.774g 8.620g  14648 S   0.3 55.6  81:26.82 java

ps aux输出:

nmx       2367  4.3 55.5 12345680 9038260 ?    Sl   May02  81:28 /bin/java 
-server -Xmx256m -Djna.nosys=true -XX:+HeapDumpOnOutOfMemoryError 
-Djava.awt.headless=true -Dfile.encoding=UTF8 -Drhino.opt.level=9 
-Dprofiler.enabled=true -Dstorage.diskCache.bufferSize=8192 

如何控制内存使用量? 是否存在CB内存泄漏?

2 个答案:

答案 0 :(得分:0)

您可以为JVM -XX设置以下设置:+ UseLargePages -XX:LargePageSizeInBytes = 2m。 这应该可以解决你的问题。

答案 1 :(得分:0)

this page, solved my issue. 简而言之: 将此配置添加到您的数据库:

static {
    OGlobalConfiguration.NON_TX_RECORD_UPDATE_SYNCH.setValue(true); //Executes a synch against the file-system at every record operation. This slows down records updates but guarantee reliability on unreliable drives
    OGlobalConfiguration.STORAGE_LOCK_TIMEOUT.setValue(300000);
    OGlobalConfiguration.RID_BAG_EMBEDDED_TO_SBTREEBONSAI_THRESHOLD.setValue(-1);
    OGlobalConfiguration.FILE_LOCK.setValue(false);
    OGlobalConfiguration.SBTREEBONSAI_LINKBAG_CACHE_SIZE.setValue(5000);
    OGlobalConfiguration.INDEX_IGNORE_NULL_VALUES_DEFAULT.setValue(true);
    OGlobalConfiguration.MEMORY_CHUNK_SIZE.setValue(32);
    long maxMemory = Runtime.getRuntime().maxMemory();
    long maxMemoryGB = (maxMemory / 1024L / 1024L / 1024L);
    maxMemoryGB = maxMemoryGB < 1 ? 1 : maxMemoryGB;
    long cacheSizeMb = 2 * 65536 * maxMemoryGB / 1024;
    long maxDirectMemoryMb =  VM.maxDirectMemory() / 1024L / 1024L;
    String cacheProp = System.getProperty("storage.diskCache.bufferSize");
    if (cacheProp==null) {
        long maxDirectMemoryOrientMb = maxDirectMemoryMb / 3L;
        long cachSizeMb = cacheSizeMb  > maxDirectMemoryOrientMb ? maxDirectMemoryOrientMb : cacheSizeMb;
        cacheSizeMb =  (long)Math.pow(2, Math.ceil( Math.log(cachSizeMb)/ Math.log((2))));
        System.setProperty("storage.diskCache.bufferSize",Long.toString(cacheSizeMb));
        // the command below generates a NullPointerException in Orient 2.2.15-snapshot
        // OGlobalConfiguration.DISK_CACHE_SIZE.setValue(cacheSizeMb);
    }
}