Orientdb Java 堆错误
Orientdb Java Heap Error
我 运行 使用 T运行snational 在 Orientdb 2.2.10 上进行测试 图表
在单线程系统上使用以下 Sudo 代码
for(i = 1 to 1000)
{
DB_Name = getRandomString()
createGraphDb(DB_Name ) using OServerAdmin : if db do not exist
gFactory = OrientGraphFactory(DB_Name ) : if db exist
graph = OrientGraphFactory.getTx()
previousEvent = null
for(j=1 to 1000)
{
currentEvent = getrandomString()
if(previousEvent and currentEvent != null)
{
- create Vertex named currentVertex and edges between them
- (from previous to current event)
}
else
{
create vertex named current event
}
previousEvent = currentEvent
}
graph.shutdown()
}
在我的外循环几次迭代后,我得到了以下异常。
Exception in thread "Thread-0" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOfRange(Unknown Source)
at java.lang.String.<init>(Unknown Source)
at java.lang.String.substring(Unknown Source)
at java.lang.String.split(Unknown Source)
at java.lang.String.split(Unknown Source)
at com.orientechnologies.orient.core.config.OStorageConfiguration.fromStream(OStorageConfiguration.java:268)
at com.orientechnologies.orient.core.config.OStorageConfiguration.fromStream(OStorageConfiguration.java:497)
at com.orientechnologies.orient.core.config.OStorageConfiguration.load(OStorageConfiguration.java:207)
at com.orientechnologies.orient.client.remote.OStorageRemote.open(OStorageRemote.java:330)
at com.orientechnologies.orient.core.db.document.ODatabaseDocumentTx.open(ODatabaseDocumentTx.java:257)
at com.orientechnologies.orient.core.db.OPartitionedDatabasePool$DatabaseDocumentTxPooled.internalOpen(OPartitionedDatabasePool.java:445)
at com.orientechnologies.orient.core.db.OPartitionedDatabasePool.openDatabase(OPartitionedDatabasePool.java:308)
at com.orientechnologies.orient.core.db.OPartitionedDatabasePool.acquire(OPartitionedDatabasePool.java:263)
at com.tinkerpop.blueprints.impls.orient.OrientBaseGraph.<init>(OrientBaseGraph.java:144)
at com.tinkerpop.blueprints.impls.orient.OrientTransactionalGraph.<init>(OrientTransactionalGraph.java:78)
at com.tinkerpop.blueprints.impls.orient.OrientGraph.<init>(OrientGraph.java:135)
at com.tinkerpop.blueprints.impls.orient.OrientGraphFactory.getTx(OrientGraphFactory.java:119)
我的 sudo 代码或 OrientDb 有问题吗?
如果他们有更好的方法,请提出建议。
谢谢..!
您有多少 RAM 可用?例如,如果您可以为 Java 进程分配最大 8GB,通常最好分配小堆和大磁盘缓存缓冲区(堆外内存)。所以而不是:
java -Xmx8g ...
您可以试试这个:
java -Xmx800m -Dstorage.diskCache.bufferSize=7200 ...
有关详细信息,您可以阅读有关 performance tuning on official documentation 的页面。
希望对您有所帮助。
在 OrientDB 中,事务将更改保存在 RAM 中,因此如果您有包含数十万个元素的事务,则可能会导致此问题。我建议您提交所有 X 元素。我建议从1000开始,然后根据结果进行调整。
您可以使用 -XX:+PrintGC -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintTenuringDistribution -Xloggc:$ORIENTDB_HOME/log/gc_%p_%[= 检查堆使用情况17=] on server (可以添加最新的XX标志,仅用于调查从新到旧的升级)。
您可以在您的客户端上添加类似的设置(仅更改 gc.log 选项)。根据你的伪代码,我只是 运行 a java class(Mac 上的 8u102,16gb 和 i7),但是 运行ning 1 循环(1 db) 有 1000 个顶点+边,它成功地完成了作业而没有 OutOfMemory
再见
克劳迪奥
我 运行 使用 T运行snational 在 Orientdb 2.2.10 上进行测试 图表
在单线程系统上使用以下 Sudo 代码
for(i = 1 to 1000)
{
DB_Name = getRandomString()
createGraphDb(DB_Name ) using OServerAdmin : if db do not exist
gFactory = OrientGraphFactory(DB_Name ) : if db exist
graph = OrientGraphFactory.getTx()
previousEvent = null
for(j=1 to 1000)
{
currentEvent = getrandomString()
if(previousEvent and currentEvent != null)
{
- create Vertex named currentVertex and edges between them
- (from previous to current event)
}
else
{
create vertex named current event
}
previousEvent = currentEvent
}
graph.shutdown()
}
在我的外循环几次迭代后,我得到了以下异常。
Exception in thread "Thread-0" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOfRange(Unknown Source)
at java.lang.String.<init>(Unknown Source)
at java.lang.String.substring(Unknown Source)
at java.lang.String.split(Unknown Source)
at java.lang.String.split(Unknown Source)
at com.orientechnologies.orient.core.config.OStorageConfiguration.fromStream(OStorageConfiguration.java:268)
at com.orientechnologies.orient.core.config.OStorageConfiguration.fromStream(OStorageConfiguration.java:497)
at com.orientechnologies.orient.core.config.OStorageConfiguration.load(OStorageConfiguration.java:207)
at com.orientechnologies.orient.client.remote.OStorageRemote.open(OStorageRemote.java:330)
at com.orientechnologies.orient.core.db.document.ODatabaseDocumentTx.open(ODatabaseDocumentTx.java:257)
at com.orientechnologies.orient.core.db.OPartitionedDatabasePool$DatabaseDocumentTxPooled.internalOpen(OPartitionedDatabasePool.java:445)
at com.orientechnologies.orient.core.db.OPartitionedDatabasePool.openDatabase(OPartitionedDatabasePool.java:308)
at com.orientechnologies.orient.core.db.OPartitionedDatabasePool.acquire(OPartitionedDatabasePool.java:263)
at com.tinkerpop.blueprints.impls.orient.OrientBaseGraph.<init>(OrientBaseGraph.java:144)
at com.tinkerpop.blueprints.impls.orient.OrientTransactionalGraph.<init>(OrientTransactionalGraph.java:78)
at com.tinkerpop.blueprints.impls.orient.OrientGraph.<init>(OrientGraph.java:135)
at com.tinkerpop.blueprints.impls.orient.OrientGraphFactory.getTx(OrientGraphFactory.java:119)
我的 sudo 代码或 OrientDb 有问题吗?
如果他们有更好的方法,请提出建议。
谢谢..!
您有多少 RAM 可用?例如,如果您可以为 Java 进程分配最大 8GB,通常最好分配小堆和大磁盘缓存缓冲区(堆外内存)。所以而不是:
java -Xmx8g ...
您可以试试这个:
java -Xmx800m -Dstorage.diskCache.bufferSize=7200 ...
有关详细信息,您可以阅读有关 performance tuning on official documentation 的页面。
希望对您有所帮助。
在 OrientDB 中,事务将更改保存在 RAM 中,因此如果您有包含数十万个元素的事务,则可能会导致此问题。我建议您提交所有 X 元素。我建议从1000开始,然后根据结果进行调整。
您可以使用 -XX:+PrintGC -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintTenuringDistribution -Xloggc:$ORIENTDB_HOME/log/gc_%p_%[= 检查堆使用情况17=] on server (可以添加最新的XX标志,仅用于调查从新到旧的升级)。
您可以在您的客户端上添加类似的设置(仅更改 gc.log 选项)。根据你的伪代码,我只是 运行 a java class(Mac 上的 8u102,16gb 和 i7),但是 运行ning 1 循环(1 db) 有 1000 个顶点+边,它成功地完成了作业而没有 OutOfMemory
再见 克劳迪奥