Ответ 1
Использует ли ByteArrayOutputStream.close() действительно освободить память?
Нет. Это абсолютно ничего. Вы можете посмотреть исходный код:
public void close() throws IOException {
}
Чтобы освободить память, убедитесь, что нет ссылок на нее, и пусть сборщик мусора делает свое дело. Как и любой другой нормальный объект.
Режимы, основанные на файлах и сокетах, являются особыми, поскольку они используют ресурсы ОС без памяти (файловые дескрипторы), которые вы можете использовать независимо от памяти. То, что закрытие их явно важно. Но это не относится к чисто основанному на памяти ByteArrayOutputStream
.