Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
GoslingJava2.doc
Скачиваний:
139
Добавлен:
23.02.2016
Размер:
2.39 Mб
Скачать

14.1. Стандартный поток ввода/вывода

Вы можете осуществлять стандартные операции ввода/вывода с помощью трех системных потоков, которые являются статическими полями класса System,— System.in, System.out и System.err:

public static InputStream in

Стандартный входной поток для чтения символьных данных.

public static OutputStream out

Стандартный выходной поток для вывода сообщений.

public static PrintStream err

Стандартный поток для вывода сообщений об ошибках. Пользователи часто перенаправляют стандартный вывод программы в файл, однако приложение при этом должно иметь возможность вывести сообщение об ошибке так, чтобы пользователь его увидел. Поток err предназначен для тех сообщений об ошибках, которые не перенаправляются вместе со стандартным выводом. Потоки out и err являются объектами класса PrintStream, поэтому для вывода сообщений в err используются те же методы, что и для out.

14.2. Управление памятью

Хотя Java не позволяет явно уничтожать ненужные объекты, вы можете непосредственно вызвать сборщик мусора, используя метод gc класса Runtime. Класс Runtime также содержит метод runFinalization для вызова ожидающих блоков завершения (finalizers). Класс Runtime содержит два метода для вывода информации о состоянии памяти:

public long freeMemory()

Возвращает примерное количество свободных байтов системной памяти.

public long totalMemory()

Возвращает общее количество байтов системной памяти.

Класс System содержит статические методы gc и runFinalization, которые вызывают соответствующий метод для текущего runtime-контекста.

Не исключено, что метод Runtime.gc не сможет освободить дополнительную память за счет избавления от “мусора”— его может и не быть, к тому же не все сборщики мусора могут находить ненужные объекты по требованию. Тем не менее перед созданием большого количества объектов (особенно в приложениях, критических по времени, на работе которых могут отрицательно сказаться накладные расходы по сборке мусора) все же стоит вызвать метод gc. Он приносит двойную пользу: вы начинаете работу с максимальным объемом свободной памяти и сокращаете вероятность вызова сборщика мусора во время выполнения программы. Следующий метод освобождает всю возможную память:

public static void fullGC() {

Runtime rt = Runtime.getRuntime();

long isFree = rt.freeMemory();

long wasFree;

do {

wasFree = isFree;

rt.gc();

isFree = rt.freeMemory();

} while (isFree >> wasFree);

rt.runFinalization();

}

Данный метод в цикле вызывает gc, при этом объем свободной памяти freeMemory увеличивается до определенного предела, после достижения которого дальнейшие вызовы gc, скорее всего, ни к чему не приведут. Затем мы обращаемся к runFinalization, чтобы немедленно выполнить все завершающие действия, не позволяя сборщику мусора отложить их на потом.

Обычно вам незачем использовать runFinalization, поскольку методы finalize вызываются сборщиком мусора асинхронно. Однако при некоторых обстоятельствах (например, при нехватке ресурса, освобождаемого методом finalize) вынужденное исполнение всех возможных завершающих действийспособно принести пользу. Конечно, нет никакой гарантии, что ожида-ющиезавершения объекты используют данный ресурс, так что вызов run Finalization может оказаться бесполезным.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]