Couchbase Client выходит из строя с OutofmemoryError на слишком большом количестве потоков ожиданияJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Couchbase Client выходит из строя с OutofmemoryError на слишком большом количестве потоков ожидания

Сообщение Anonymous »

У меня есть приложение для партии Java, которое выполняет несколько этапов обработки на ковше Couchbase, размещенном в одном кластере узлов. База данных не является ни большим, ни требуемой молнией, всего около 500 Мб данных. Они делают это параллельно или неоднократно, таким образом, один пакетный прогон приводит во многие вызовы cluster.connect () .
, в то время как это работало нормально, так как неделя я воспринимаю тайм -ауты и Outofmemororrors.

Код: Выделить всё

[16.081s][warning][os,thread] Failed to start thread "Unknown thread" - pthread_create failed (EAGAIN) for attributes: stacksize: 256k, guardsize: 4k, detached.
[16.082s][warning][os,thread] Failed to start the native thread for java.lang.Thread "boundedElastic-evictor-225"
13:11:59.543 [jberet-1] ERROR org.jberet - JBERET000007: Failed to run job createTickets, createTickets, org.jberet.job.model.Step@78739007
java.lang.OutOfMemoryError: unable to create native thread: possibly out of memory or process/resource limits reached
at java.base/java.lang.Thread.start0(Native Method) ~[?:?]
at java.base/java.lang.Thread.start(Unknown Source) [?:?]
at java.base/java.lang.System$2.start(Unknown Source) ~[?:?]
...
Добавление параметра JVM -xx:+Heapdumponoutofmemoryerror не запускает дампы кучи. Увеличение кучи тоже не помогло, но я обнаружил, что более 2000 резьбов ожидания до того, как произойдет ошибка. Почти все потоки связаны с соединениями Couchbase. Это ограничивает мое приложение при обработке дальнейших данных. < /P>
Я проверил в коде, что все соединения Couchbase закрыты, когда больше не требуется - но количество потоков остается и, кажется, не уходит. Случай это Couchbase). Я проверил интерфейс администратора, но нет никаких признаков какой -либо проблемы. < /P>
Что может быть основной причиной для такого поведения? На что я должен посмотреть, чтобы узнать больше? Удаление сцепленных номеров из имен потоков, я нахожу эти подсчеты:

Обновление 2
Так много людей попросили проанализировать код. Теперь, зная, что искать, я воссоздал проблему. Вот код: < /p>
import com.couchbase.client.java.Cluster;
import com.couchbase.client.java.ClusterOptions;
import com.couchbase.client.java.codec.JacksonJsonSerializer;
import com.couchbase.client.java.env.ClusterEnvironment;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import java.lang.management.ManagementFactory;
import java.time.Duration;
import java.time.temporal.ChronoUnit;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

/**
*
* @author hiran.chaudhuri
*/
public class CouchbaseProblem {
private static final Logger log = LogManager.getLogger();

public static Cluster connectSimple(String connectionString, String username, String password) {
return Cluster.connect(connectionString, username, password);
}

public static Cluster connectWithEnv(String connectionString, String username, String password) {
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());

ClusterEnvironment environment = ClusterEnvironment.builder()
.jsonSerializer(JacksonJsonSerializer.create(mapper))
.build();
ClusterOptions co = ClusterOptions.clusterOptions(username, password);
co.environment(environment);
return Cluster.connect(connectionString, co);
}

public static int getThreadCount() {
return ManagementFactory.getThreadMXBean().getThreadCount();
}

public static void main(String[] args) throws Exception {
int max = 100;

for (int i = 0; i < max; i++) {
log.info("Simple Iteration {}/{}, Threads {}", i, max, getThreadCount());

Cluster c = connectSimple(args[0], args[1], args[2]);
Thread.sleep(Duration.of(1, ChronoUnit.SECONDS));
c.disconnect();
}

for (int i = 0; i < max; i++) {
log.info("Env Iteration {}/{}, Threads {}", i, max, getThreadCount());

Cluster c = connectWithEnv(args[0], args[1], args[2]);
Thread.sleep(Duration.of(1, ChronoUnit.SECONDS));
c.disconnect();
}
}
}
< /code>
Вы можете увидеть две петли, каждая из которых создает и закрывает соединения Couchbase. Во время запуска они регистрируют итерацию и количество потоков, о которых нужно заботиться JVM.>

Подробнее здесь: https://stackoverflow.com/questions/797 ... ng-threads
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»