2009-11-04 2 views
0

Я запускаю java-программу на многих компьютерах, которые взаимодействуют между ними. Через несколько часов (2-5 часов) компьютеры начинают сбой (потоки начинают попадать в тупики, сообщения начинают теряться - своеобразные вещи, если учесть, что в первый час или около того все было отлично).java пустое место и потеря сообщений

У меня есть подозрение, что это потому, что я использую слишком много памяти. Я бегу на Linux, так и это отношение выходной top:

PID USER  PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 
30376 username 18 0 976m 132m 6804 S 0 4.0 0:05.60 java 
  1. ли это, кажется высокой?
  2. другие идеи, как следует, почему эти ошибки произошло бы приветствовалось бы ..

ответ

4

Другое дело, что может случаться, что вы бежите из соединений. Это случилось вчера с моим коллегой.

ulimit -n расскажет вам, сколько файлов можно открыть; netstat -at расскажет вам, сколько гнезд открыто. Когда второе число приближается к первому, попытки открыть соединения начнут сбой.

В данном конкретном случае, когда соединения все еще находились в OPEN_WAIT после использования, помогал сборщик мусора (Runtime.gc()).

3

Вы можете получить представление в тенденции использования памяти, глядя на состояние виртуальной машины Java heapsize и его регистрации на регулярной основе. Из этих журналов вы можете построить график и посмотреть, есть ли аномалии. (Кстати, шаблон головоломки нормально собирать мусор поведение.)

// Memory status 
    Runtime  runtime = Runtime.getRuntime(); 
    final long totalMem = runtime.totalMemory(); 
    final long freeMem = runtime.freeMemory(); 
    if (log.isDebugEnabled()) { 
     log.debug("Memory free=" + freeMem + 
       " used=" + (totalMem - freeMem) + 
       " total=" + totalMem); 
    } 
0

Возможные проблемы:

  1. Ресурсы (розетки, базы данных и т.д.), не будучи должным образом закрыта
  2. утечки памяти (ссылка проводится в коллекции, не закрытые ресурсы)
  3. Незначительного параллелизм ошибки, которые (которые появлялись бы в нерабочее время)
  4. Потеря сообщений из буфера на сокете, которая была перезаписана до того, как у вас есть возможность прочитать ее или получить сообщение, большее, чем буфер, обычно исправляемое с помощью потока читать сокет, как только d ata идет на него и кладет его на рабочую очередь, основная обрабатывающая нить может обрабатывать
Смежные вопросы