Это может быть деятельностью по сбору мусора, вызванной открытием / закрытием большого количества RandomAccessFile
объектов; около 45 секунд может не быть ничего волшебного - это может быть время, которое требуется JVM на вашей машине, чтобы пройти очистку кучи для освобождения объектов. Сказав это, 45 секунд - это ужасно длинная пауза GC; Одно приложение, над которым я работал в последнее время, всегда получало полный GC около 11 секунд.
Попробуйте выполнить мониторинг вашей программы, используя JConsole или JVisualVM , или при запуске программы попробуйте добавить следующие параметры:
-verbose:gc -Xloggc:gc.log -XX:+PrintGCDetails -XX:+PrintGCTimeStamps
Затем просмотрите файл gc.log , созданный для определения времени остановки приложения; если вы применяете свой код для печати временных меток, вы можете связать поведение close()
с определенной активностью GC: * 1018 *
...
if (close > 200) {
System.out.println(new Date());
System.out.println("closing " + name +
" took " + close + " ms!");
}
...
Если это связано с GC, в файле gc.log вы будете искать Полные сборки мусора и / или время остановки приложения примерно на отметках времени, которые ваша программа выводит файлы.
Работа с настройками кучи (-Xmx=...
и XX:MaxPermSize=...
) может привести к совершенно другому профилю.
Если заметить, что это временный файл, попробуйте использовать File file = File.createTempFile(prefix, suffix)
и передать его в RandomAccessFile
- это может создать файлы в / var / tmp (или как там его называют) в OS X, таким образом используя файловая система в памяти вместо дисковой файловой системы.