Вам нужно конвертировать int
в символы без генерации нового String
каждый раз, когда вы это делаете.Это можно сделать несколькими способами:
Создать собственный метод «int to characters», который преобразует в байты ASCII в byte[]
(см. Пример кода @ AndyTurner).Затем напишите byte[]
.И повторите.
Используйте ByteBuffer
, заполните его напрямую, используя пользовательский метод конвертации "в символы", и используйте Channel
для вывода байтов, когда буфер заполнен.И повторите.
Если все сделано правильно, вы сможете выводить числа без всякого мусора ... кроме ваших одноразовых буферов.
Обратите внимание, чтоSystem.out
- это PrintStream
упаковка BufferedOutputStream
упаковка FileOuputStream
.И когда вы выводите String
прямо или косвенно, используя один из методов print
, это фактически делает через BufferedWriter
, который является внутренним по отношению к PrintStream
.Это сложно ... и, очевидно, метод print(String)
генерирует мусор где-то в этой сложности.
Относительно вашего EDIT 1: когда вы многократно выводите постоянную строку, вы по-прежнему генерируете мусор.Я был удивлен этим, но я предполагаю, что это происходит в BufferedWriter
.
Относительно вашего РЕДАКТИРОВАНИЯ 2: когда вы неоднократно пишете с byte[]
, генерация мусора практически исчезает.Это подтверждает, что хотя бы одно из моих предложений будет работать.
Однако, поскольку вы отслеживаете JVM с помощью внешнего профиля, на вашей JVM также работает агент , который периодически отправляет обновления вваш профилировщикЭтот агент, скорее всего, будет генерировать небольшое количество мусора.И могут быть другие источники мусора в JVM;например, если у вас включено ведение журнала JVM GC.