【问题标题】:OrientDB - Java process: memory out of controlOrientDB - Java 进程:内存失控
【发布时间】:2016-03-07 10:49:44
【问题描述】:

我编写了一个并行算法来完成对存储在 Orient 表中的数据的计算。

为了控制内存,我尝试对这些数据进行分页,并尝试并行化我的算法以提高性能(使用 Future 任务)。

我的东方设置是:

set ORIENTDB_SETTINGS=-Dprofiler.enabled=true -Dstorage.diskCache.bufferSize=12906

set JAVA_OPTS_SCRIPT=-Xmx4096M -Djna.nosys=true -XX:+HeapDumpOnOutOfMemoryError -XX:PermSize=1024m 
-XX:MaxPermSize=1024m
-Djava.awt.headless=true -Dfile.encoding=UTF8 -Drhino.opt.level=9
-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005

Xmx 固定为 4 GB(4096MB 作为上层配置),我尝试使用 JVisualVM 监控我的 Orient 进程,如下图所示:

在 JVIsualVm 上,进程使用的堆内存始终低于其限制,但在 Windows 进程列表中,同一进程(我已突出显示 PID)占用 7 GB 并始终增长。

这是我的代码:

for (Callable worker : workers) {
    Future<Boolean> submit = executor.submit(worker);
    futures.add(submit);
}
workers.clear();
workers = null;
boolean success = true;

for (Future<Boolean> future : futures) {
    try {
        if (Boolean.TRUE.equals(future.get())) {
            [CODE BLOCK]
        } else {
            [CODE BLOCK FOR REPROCESS FUTURE]
        }
    } catch (InterruptedException e) {
        e.printStackTrace();
    } catch (ExecutionException e) {
        e.printStackTrace();
    }
}

【问题讨论】:

  • 你好,你用的是什么版本?

标签: java memory-management orientdb futuretask orientdb-2.1


【解决方案1】:

根据您的图片,进程消耗了 7GB 内存,根据您的设置-Dstorage.diskCache.bufferSize=12906 您允许消耗的存储空间略低于 13GB。如果您希望处理消耗更少的内存,您应该在设置中更改消耗内存的最大限制。磁盘缓存永远不会释放内存来为最广泛的查询实现最短的查询响应时间。

【讨论】:

  • 谢谢。所以在 windows 进程列表中我可以看到所有内存占用(RAM + 磁盘缓存)
猜你喜欢
  • 1970-01-01
  • 2015-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多