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