Как собрать "мусор" прямой буфер в Java

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

Мой подход должен иметь Таблицу Тега.

 TagId (PK)| TagName (Indexed)

Затем у Вас есть столбец TagXREFID в Вашей таблице объектов.

столбцом This TagXREFID является FK к 3-й таблице, я назову его TagXREF:

 TagXrefID | ItemID | TagId

Так, для получения всех тегов для объекта было бы что-то как:

SELECT Tags.TagId,Tags.TagName 
     FROM Tags,TagXref 
     WHERE TagXref.TagId = Tags.TagId 
         AND TagXref.ItemID = @ItemID

И получить все объекты для тега, я использовал бы что-то вроде этого:

SELECT * FROM Items, TagXref
     WHERE TagXref.TagId IN 
          ( SELECT Tags.TagId FROM Tags
                WHERE Tags.TagName = @TagName; )
     AND Items.ItemId = TagXref.ItemId;

К И набор тегов вместе, Вы были бы для изменения вышеупомянутого оператора немного для добавления И Теги. TagName = @TagName1 И Теги. TagName = @TagName2 и т.д.... и динамично создают запрос.

28
задан 0xCursor 24 June 2019 в 16:53
поделиться

3 ответа

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

Буферная память для прямого ByteBuffer - это выделяется за пределами нормальной кучи (чтобы сборщик мусора не перемещал его !!). Однако API-интерфейс ByteBuffer не предоставляет метода явного удаления / освобождения буфера. Поэтому я предполагаю, что сборщик мусора сделает это ... как только определит, что объект ByteBuffer больше не используется.

API ByteBuffer не предоставляет метода явного удаления / освобождения буфера. Поэтому я предполагаю, что сборщик мусора сделает это ... как только определит, что объект ByteBuffer больше не используется.

API ByteBuffer не предоставляет метода явного удаления / освобождения буфера. Поэтому я предполагаю, что сборщик мусора сделает это ... как только определит, что объект ByteBuffer больше не используется.

16
ответ дан 28 November 2019 в 03:11
поделиться

Выделенная память реализуется через встроенную библиотеку. Эта память будет освобождена при вызове метода ByteBuffer # finalize, т.е. когда Buffer gc'd. Взгляните на реализации allocate () и finalize () DirectByteBufferImpl .

buff.clear () не требуется, System.gc () будет только помогите, если, как уже упоминалось, больше не осталось ссылки на объект ByteBuffer.

5
ответ дан 28 November 2019 в 03:11
поделиться

В документации ByteBuffer говорится:

Прямой байтовый буфер может быть создан путем вызова фабричного метода allocateDirect этого класса. Буферы, возвращаемые этим методом, обычно имеют несколько более высокую стоимость выделения и освобождения, чем непрямые буферы. Содержимое прямых буферов может находиться за пределами обычной кучи со сборкой мусора, поэтому их влияние на объем памяти приложения может быть неочевидным. Поэтому рекомендуется выделять прямые буферы в первую очередь для больших долгоживущих буферов, на которые действуют собственные операции ввода-вывода базовой системы. В общем, лучше всего выделять прямые буферы только тогда, когда они дают ощутимый выигрыш в производительности программы.

В частности,

12
ответ дан 28 November 2019 в 03:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: