【发布时间】:2011-01-24 19:52:31
【问题描述】:
我在使用 Hbase 时遇到以下问题。
我有一个脚本,它启动 HBase shell 并将许多行插入到具有单列的表中。我尝试插入 10,000 行,但在大约 1,700 行之后,我得到了可怕的“java.lang.OutOfMemoryError:无法创建新的本机线程”错误。我尝试将 Java 堆大小从默认的 1000mb 更改为 1800mb,但这不允许我插入超过 1700 左右的行。
但是,我注意到我可以插入 1000 行、退出 shell、重新启动 shell、在同一个表中再插入 1000 行、再次退出等等。我对 JVM 的了解还不够,无法弄清楚为什么它允许我在多个会话中执行此操作,但不允许我在同一个会话中批量插入。
有人可以向我解释一下这里发生了什么,我可以做些什么吗?
编辑:
我现在使用的是 64 位机器,red hat linux 5,Java 1.6。我给 HBase 的堆大小为 20gb(我总共有大约 32 gigs 内存)。 对于堆栈大小,我给 8mb。我相信 64 位的默认值是 2mb;使用 2mb 时我遇到了同样的错误,将其增加到 8mb 根本没有帮助(无论堆栈大小如何,我都只能插入相同数量的行,~1700)。
我已经读到减小堆大小可以使这个错误消失,但这也没有帮助。下面是我正在设置的 jvm 选项(除了堆栈大小,一切都是默认的)。
HBASE_OPTS="$HBASE_OPTS -ea -Xss8M -XX:+HeapDumpOnOutOfMemoryError -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode"
【问题讨论】:
-
你能分享你设置的 JVM 参数吗?