Как создать объект в определенной памяти и с определенным размером в Java? - PullRequest
0 голосов
/ 07 января 2011

Я не знаю, как задать этот вопрос, но я хочу создать объект по определенному адресу (памяти) и с определенным размером.Например, class A {int, string, class B, List<array>} не должен превышать 30 МБ, иначе выдает ошибку NoMoreMemoryException

Я знаю, что в Java нет указателя (даже если хакеры C ++ настаивают), но как указать на конкретный адрес

Ответы [ 6 ]

1 голос
/ 07 января 2011

Я предполагаю, что вы получаете OutOfMemoryError, возможно, потому что ваш -mx или -Xmx слишком низко его установил.

Не очень ясно, какова ваша структура данных или почему вы считаете, что она не должна быть 30 МБОднако 30 МБ в наши дни - довольно тривиальный объем памяти компьютера.Сервер с 8 ГБ стоит около 850 фунтов стерлингов.Вы программируете для мобильного устройства?

Лучший способ узнать, сколько использует структура и зачем использовать профилировщик памяти.VisualVM - это профилировщик, который поставляется с Java.YourKit - это коммерческий профилировщик, который я нахожу лучше.

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

Возможно, если бы вы могли уточнить, что вы делаете, когда могли бы предложить лучшее решение.

В JVM Sun / Oracle вы можете указывать на определенное место в памяти и выделять / освобождать память, как в C, но это весьма вряд ли будет хорошей идеей.;)

1 голос
/ 07 января 2011

Нет способа сделать это на чистой Java. Если по какой-то причине у вас есть требование сделать именно это, вам следует использовать JNI / C.

Как примечание, метод toString() (в зависимости от реализации) иногда может дать вам начальный адрес, где создается объект, но он может быть перемещен JVM в любое время.

1 голос
/ 07 января 2011

Это должно помочь вам на полпути: http://robaustin.wikidot.com/how-to-write-to-direct-memory-locations-in-java

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

Еще один более мощный вариант -используйте JNI и делайте то, что вам нужно, на C или C ++.

1 голос
/ 07 января 2011

Напишите код JNI и вызовите его через код Java. Пожалуйста, посмотрите на исходный код класса Object, написанный на c, в частности, метод clone, который выполняет побитовое копирование в памяти для создания объекта clone. оттуда вы можете использовать логику и использовать ее в своем собственном классе, чтобы узнать размер атрибутов каждого поля члена.

1 голос
/ 07 января 2011

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

Вы можете получить размер объекта в памяти. Смотрите здесь для деталей

0 голосов
/ 15 июня 2013

Я знаю, что этот пост действительно старый, но я все равно прокомментировал его: -)

На самом деле вы можете получить доступ к памяти, если она управляется JVM, которую вы можете используйте sun.misc.Unsafe, который приносит некоторые специальные методы, которые позволяют пользователю доступ к памяти напрямую.

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

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

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