Я получаю это исключение в Java:
java.io.FileNotFoundException: (Too many open files)
Я ищу способы устранить эту проблему.
Эта ошибка, очевидно, указывает на то, что JVM выделила слишком много дескрипторов, и соответствующая ОС не позволит иметь больше. Либо у меня где-то есть утечка с неправильно закрытыми соединениями / потоками.
Этот процесс выполняется в течение нескольких дней без остановок и в конечном итоге выдает исключение. Это неоднократно происходит после 12-14 дней безотказной работы.
Как вы боретесь с этим? Есть ли способ получить список выделенных дескрипторов в JVM или отслеживать, когда он достигает определенного количества? Я хотел бы, чтобы они были напечатаны и посмотрели, как они растут и когда. Я не могу использовать профилировщик, потому что это производственная система, и у меня возникают трудности с ее воспроизведением в процессе разработки. Любое предложение?
Я слежу за размером свободной кучи и выдаю «сигнал тревоги», когда он приближается к 1% от общего значения, указанного в -Xmx. Я также знаю, что если число потоков превышает 500, то что-то определенно выходит из-под контроля. Теперь, есть способ узнать, что моя JVM выделяет слишком много дескрипторов из ОС и не возвращает их, например, сокеты, открытые файлы и т. д. Если бы я знал это, я бы знал, где и когда искать.