У меня возникла следующая проблема с Hbase.
У меня есть скрипт, который запускает оболочку HBase и вставляет много строк в таблицу с одним столбцом. Я попытался вставить 10000 строк, но примерно через 1700 я получаю страшную ошибку «java.lang.OutOfMemoryError: не удалось создать новый собственный поток». Я попытался изменить размер кучи Java с 1000 МБ по умолчанию до 1800 МБ, но это не позволяет мне вставлять более 1700 строк или около того.
Однако я заметил, что могу вставить 1000 строк, выйти из оболочки, перезапустить оболочку, вставить еще 1000 в ту же таблицу, выйти снова, и так далее, и так далее. Я не совсем понимаю, что такое JVM, чтобы понять, почему он позволяет мне делать это в нескольких сеансах, но не позволяет мне выполнять пакетную вставку в одном сеансе.
Может кто-нибудь объяснить мне, что здесь происходит, и что я могу с этим поделать?
EDIT:
Сейчас я использую 64-битную машину Red Hat Linux 5 с Java 1.6. Я даю HBase размер кучи 20 Гб (у меня всего ~ 32 гигабайта памяти).
Для размера стека я даю 8 МБ. Я полагаю, что значение по умолчанию для 64-битной системы составляет 2 МБ; с 2 МБ я получил эту же ошибку, и увеличение до 8 МБ вообще не помогло (я мог только вставить одинаковое количество строк независимо от размера стека, ~ 1700).
Я читал, что уменьшение размера кучи может устранить эту ошибку, но это тоже не помогло. Ниже приведены параметры jvm, которые я устанавливаю (все по умолчанию, кроме размера стека).
HBASE_OPTS="$HBASE_OPTS -ea -Xss8M -XX:+HeapDumpOnOutOfMemoryError -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode"