2016-06-11 3 views
-1

Можно ли избежать обнуления/инициализации массива в Java?Избежать инициализации массива в Java

Мне нужно быстро выделить новые байт-массивы фиксированной длины, которые будут полностью заполнены предопределенными данными. Поэтому мне не нужно, чтобы JVM автоматически обнулял массив при создании экземпляра, и я, конечно, не против, если массив содержит мусор. Все, что мне нужно, это постоянное распределение массивов по времени, которое, к сожалению, становится O (n) из-за упомянутой проблемы обнуления.

Будет ли использовать небезопасную помощь?

+1

Вы можете сделать это как нетто, а также ручное объединение и подсчет ссылок http://netty.io/4.0/api/io/netty/buffer/PooledByteBufAllocator.html + http://netty.io/4.0 /api/io/netty/util/ReferenceCounted.html#release() - дубликат не является очевидным (и я не думаю, что это хороший дубликат), но если вы нажмете немного, вы могли бы найти его как http://mishadoff.com/blog/java-magic-part-4-sun-dot-misc-dot-unsafe/ часть о «Интересных случаях использования Избегайте инициализации» - отредактируйте: hmm не там, но в http: // stackoverflow.com/a/13785284/995891 – zapl

+0

Еще одна вещь, которую вы могли бы рассмотреть, если вам нужен массив только для временных целей, имейте в виду, что «ThreadLocal» хранит их. Дает вам один поток и безопасен и быстро, пока вы используете пулы потоков. – zapl

ответ

1

JVM всегда инициализирует массивы. Но вы можете повторно использовать один и тот же массив, и он будет инициализирован один раз.

+0

К сожалению, я не могу, потому что эти массивы хранятся в течение неопределенного периода времени асинхронной сетевой библиотекой. Повторное использование их приводит к перезаписи частично неотправленных сообщений. Вот почему я надеялся на решение, которое бы быстро распределяло новые массивы без их обнуления. – maxim1

+0

Если вы знаете, когда библиотека выполнена с помощью буфера, вы можете использовать объединение массивов. То есть создать пул массивов и дать/вернуть их из пула. – Argb32

1

Класс sun.misc.Unsafe официально недокументирован.

http://mishadoff.com/blog/java-magic-part-4-sun-dot-misc-dot-unsafe/ От

инициализации Избегайте

метод allocateInstance может быть полезно, когда вам нужно, чтобы пропустить объект инициализации фазы или обхода безопасности проверки в конструкторе или вы хотите экземпляр этого класса, но не иметь любого публичного конструктора.

Некоторые ресурсы указывают на его удаление с Java 9.

+0

Как вы распределите массив на куче с предопределенной длиной? Я не нашел рабочего решения. – maxim1

0
  1. Какие приложения у вас есть, что инициализация массива стала узким местом в производительности?
  2. В ответ на «К сожалению, я не могу, потому что эти массивы хранятся в течение неопределенного периода времени асинхронной сетевой библиотекой. Повторное использование результатов приводит к перезаписи частично неотправленных сообщений».: Затем используйте пул и только повторное использование массивы, которые в настоящее время не используются. Однако вам придется это обойти. Итак, создается ли массив действительно, что большая часть проблемы?
+0

1. Тикерная установка 2. Возможно использование пула. Спасибо за идею. – maxim1

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