OrientDB - Java 进程:内存失控
OrientDB - Java process: memory out of control
我编写了一个并行化算法来完成对存储在 Orient table 中的数据的计算。
为了控制内存,我尝试对这些数据进行分页,并尝试并行化有关提高性能的算法(使用 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();
}
}
根据您的图片,进程消耗了 7GB 的内存,根据您的设置 -Dstorage.diskCache.bufferSize=12906
您允许消耗的存储内存少于 13GB。如果您希望进程消耗更少的内存,您应该在设置中更改消耗内存的最大限制。磁盘缓存从不释放内存以实现最广泛查询的最小查询响应时间。
我编写了一个并行化算法来完成对存储在 Orient table 中的数据的计算。
为了控制内存,我尝试对这些数据进行分页,并尝试并行化有关提高性能的算法(使用 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();
}
}
根据您的图片,进程消耗了 7GB 的内存,根据您的设置 -Dstorage.diskCache.bufferSize=12906
您允许消耗的存储内存少于 13GB。如果您希望进程消耗更少的内存,您应该在设置中更改消耗内存的最大限制。磁盘缓存从不释放内存以实现最广泛查询的最小查询响应时间。