У меня есть сервис палача, который имеет размер пула 1.OutOfMemoryError: не удалось создать новую родную нить при использовании Исполнителя
код:
@POST
@Path("insertOrUpdate")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response insertOrUpdate(final String user) {
try {
new MYSQLProvider().insertOrUpdate(user);
resulTObj.put("success", true);
resulTObj.put("msg", "");
ExecutorService executor = Executors.newFixedThreadPool(1);
executor.execute(new Runnable() {
@Override
public void run() {
//fetch list of all the user ids here and fire a multicast
log4j.info("Executor called");
Map<String, String> m = new HashMap<String, String>();
m.put("TAG", "MOVEMENT");
m.put("user", user);
GCMServerJava.sendMsgToAll(m);
}
});
} catch (SQLException | JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
resulTObj.put("success", false);
resulTObj.put("msg", e.getMessage());
}
return Response.status(200).entity(resulTObj.toString()).build();
}
Я получаю OutOfMemory Ошибки после нескольких дней работает на сервере. Почему это происходит? Всюду упоминается, что размер кучи Java меньше, мы должны увеличить это. Я понимаю, так как размер пула потоков составляет всего 1, только один фоновый поток работает и все остальные находятся в очереди. В этом случае распределение памяти должно быть достаточным. Я что-то пропустил, и как это исправить.
благодаря
ли этот код, выполняющийся каждый раз, когда вам нужно запустить логику? Или вы создаете исполнителя только один раз и запускаете '' 'executor.execute ...' '' code каждый последующий раз? В первом случае количество исполнителей будет нарастать, тогда как в последнем случае задания будут передаваться одному исполнителю. –
Ох! Я думаю, вы правы. Это вызвано из веб-службы при ударе запроса, но я все еще не уверен. В моем вопросе я скопировал весь код. Можете ли вы проверить и рассказать? И спасибо за ответ так скоро. –
Да, вы создаете нового исполнителя и новый поток для каждого запроса. Таким образом, потоки накапливаются, и в итоге у вас заканчивается память. Переместите инициализацию исполнителя из метода, поэтому он создается только один раз, и проблема должна быть исправлена. – jmruc