2016-01-25 2 views
-1

У меня проблемы с ОЗУ при запуске моей программы Java на сервере. Я думаю, что проблема связана с тем, что я пишу файлы журналов, которые могут быть довольно большими (более 100 МБ). Я ищу эффективный способ сделать это, и я запутался в различных доступных вариантах.Сохранение ОЗУ при записи файлов журнала

После того, как смотреть на Oracle documentation, я видел, что смыва поток может быть полезным, но я не уверен, какой из различных классов я должен идти. В настоящее время я использую PrintWriter class, который вызывает проблему с ОЗУ, и я ищу лучшую альтернативу.

У меня есть вопрос о промывке потока. Из того, что я понял, строки добавляются к потоку, а затем очищаются после вызова метода или при превышении кэш-памяти. Поскольку я пишу файлы журналов, я не думаю, что это хорошее решение, потому что если в какой-то момент программа выйдет из строя, я хотел бы знать, каков был ее последний статус. Я прав?

я могу видеть, что PrintSteam класс имеет конструктор, который требует Writer и логическое рассказывал ли AutoFlush должна быть активирована или нет. Класс FileWriter (наследующий от Writer) также имеет . Напишите и метод flush, поэтому я смущен. Что происходит, когда я создаю FileWriter, передать его в PrintSteam и установите AutoFlush к истинной на PrintStream? Является ли autoflush действительно активным, я имею в виду, что это неявно вызывает flush метод FileWriter?

И наконец, какой класс я должен использовать для записи файлов журнала? Опять же, моим приоритетом является сохранение ОЗУ и возможность легко отслеживать сбои/ошибки. Должен ли я идти за небуферным подходом.

Благодаря

EDIT: Вот то, что мой код выглядит следующим образом:

output = new PrintWriter(filename, "utf-8"); 
output.println("Some info"); 
+3

Вам нужно использовать профилировщик, чтобы быть уверенным, что проблема связана с тем, что вы регистрируетесь. Я не могу себе представить, что ведение журнала является реальной проблемой, если вы не используете какое-то асинхронное ведение журнала, которое хранит журналы в памяти. – Augusto

+0

@Augusto Я узнал, что когда программа убита системой, файл журнала отсутствует, что заставляет меня думать, что оно сгенерировано в конце выполнения или через некоторое время. Кроме того, программа выполняет одни и те же вещи снова и снова в цикле, и только через полчаса ее убивают. Единственное, что меняется, это размер зарегистрированных данных, поскольку повторяются одни и те же инструкции. Как вы думаете? – user1319182

+0

Если что-то сумасшедшее сделано (например, огромный буфер), запись в файл не вызывает проблемы с памятью. – Henry

ответ

1

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

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

Является AutoFlush действительно активным, я имею в виду бы неявно вызвать вровень метод FileWriter?

Я так считаю - вровень вызывает Java писать буфер на диск. Если вы предоставите результат экспериментов и, возможно, некоторые данные из jprofiler или другого инструмента анализа кучи, вам будет легче помочь.

Наконец, что класс я должен идти, чтобы написать свои лог-файлы?

Будут всегда находиться буфер между ОЗУ и диском. Этот базовый подход, который вы описываете, должен иметь возможность записывать произвольное количество журналов на диск, если вы будете осторожны с буферами очистки и закрытием сценариев перед выходом.

Это, как говорится, редко бывает доработать такой подход низкого уровня для довольно распространенной проблемы. Сначала я просмотрю пакет java.util.logging. Некоторые люди заходят так далеко, что используют аспект ориентированного программирования на основе ввода для ведения журнала. Регистрация может быть сложной частью распределенной системы с низкими требованиями к задержке.

Смежные вопросы