Java: выделить неинициализированный блок памяти? - PullRequest
1 голос
/ 25 января 2009

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

Ответы [ 6 ]

6 голосов
/ 25 января 2009

Нет. Вы не можете отделить распределение от инициализации, по крайней мере, для массивов.

Что именно вы пытаетесь определить?

Причина, по которой я спрашиваю, состоит в том, что в работающей JVM существует множество переменных, которые будут влиять на любое время выделения объектов, начиная от размера объекта (который определяет, где он расположен), до того, что еще происходит в JVM в то же время (после того, как вы начнете распределять объекты, они будут перетасовываться между различными поколениями), независимо от того, решит ли Hotspot, что ваш код ничего не делает и может быть заменен неактивным.

Кстати, существует похожий, но не перекрывающийся набор переменных, которые мешают бенчмаркингу malloc () ...

1 голос
/ 25 января 2009

Может быть, java.nio.ByteBuffer - это то, что вы ищете. Ваши причины немного расплывчаты: -)

1 голос
/ 25 января 2009

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

1 голос
/ 25 января 2009

Если бы вы могли это сделать, вы бы сравнивали то, чего не происходит в реальных программах, поэтому результат ничего бы не значил.

Я сделал нечто похожее на это и обнаружил, что распределение занимает около 250 нс в 50% случаев и 500 нс или более в 10% случаев и около 1200 нс в 1% случаев.

Это зависит от скорости вашего процессора, архитектуры памяти вашей машины и того, какой объект вы создаете.

0 голосов
/ 26 января 2009

Нет способа выделить неинициализированный блок памяти. и проходят через «нормальный» механизм выделения / GC.

То, что вы можете сделать, - это создать прямой ByteBuffer по произвольному адресу памяти (из нативного метода). Но это не даст вам эталон «нормальной» обработки объектов (хотя, если вы хотите тестировать, это нормальное распределение / освобождение, неясно, зачем вам это нужно).

0 голосов
/ 25 января 2009

Единственный способ, которым вы могли бы сделать то, о чем вы спрашиваете, - это через JNI, который сделает спорным любой тест, который вы получите, поскольку он не будет отражать истинное использование Java. По причинам, которые другие уже дали. Любое распределение через Java (через «new») всегда инициализирует память.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...