Косвенный доступ к куче Java - PullRequest
1 голос
/ 11 марта 2010

В настоящее время я использую HashMap<Class, Set<Entry>>, который может содержать несколько миллионов недолговечных и долгоживущих объектов. (Entry - это класс-оболочка вокруг Object и целого числа, которое является повторяющимся числом).

Я понял: все эти Object хранятся в куче JVM. Тогда мой вопрос всплыл в моей голове; вместо того, чтобы выделять огромные объемы памяти для HashMap, можно ли сделать это лучше (меньшее потребление памяти)?

Есть ли способ косвенного доступа к Object s в Java Heap, основанный на Class из Object s?

Под «косвенно» я имею в виду: без указателя на Object. Под «доступом» я имею в виду: получить указатель на Object в куче.

Ответы [ 4 ]

2 голосов
/ 11 марта 2010

Я не совсем понимаю цель вашего кода, но боюсь, что ваш код включает в себя частые ошибки OutOfMemoryError, нет?

Во всяком случае.

Вы можете получить ссылки на объекты, которые не будут препятствовать сборке мусора этими объектами, такие как SoftReference (по умолчанию используется при myObj = thisObj;), WeakReference и PhantomReference.

Итак, вы можете (и должны, на самом деле, использовать WeakReference, чтобы позволить GC выполнять свою работу). Однако для динамического исследования памяти уже существуют приложения, такие как VisualVM , которые используют протокол, позволяющий внешнему процессу запрашивать виртуальную машину: JVMPI .

Я думаю, тебе действительно стоит взглянуть на это.

1 голос
/ 11 марта 2010

Нет. По сути, каждый объект знает свой класс, но класс не знает всех своих объектов - он не является обязательным для работы JRE и будет только бесполезным расходом.

Зачем вам все равно знать все экземпляры этих классов? Может быть, есть лучший способ решить вашу актуальную проблему.

0 голосов
/ 11 марта 2010

Карта содержит только указатели на объекты в куче. Я не думаю, что вы можете сделать это лучше,

0 голосов
/ 11 марта 2010

HashMap не должно быть слишком много. И я не думаю, что можно копаться в куче с публичным Java API. Скорее всего, Объектов там не будет, так как они будут собраны, если нет ссылки.

То, что вы могли бы сделать, если накладные расходы HashMap слишком велики, это выделить массив, например Object [] или Entry []. Конечно, вы потеряете возможности быстрого доступа, добавления и удаления (учитывая, что массив имеет фиксированный размер, трудно добавлять элементы, если массив слишком мал).

При использовании решения с массивами вам нужно заранее знать, сколько у вас будет записей, или скопировать массив в больший массив, если необходимо, принять во внимание нулевые значения, если вы разрешите удаление и так далее. Что делает ArrayList, в основном.

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