Java и виртуальная память: контролирует / влияет, какие объекты хранятся в основной памяти? - PullRequest
4 голосов
/ 23 января 2012

Я пишу кеш-сервер в java, который будет кешировать данные изображений (jpgs, pngs, tiff и т. Д.) В памяти для быстрого доступа через http.Изображения предоставляются другим сервисом, что является дорогостоящей операцией, поэтому я хочу кэшировать их на своем сервере кэширования.

Есть несколько причин, почему я пишу это с нуля, поэтому я ищу ответ не [какой-нибудь умный программный продукт]

Вопрос : КакМогу ли я сохранить определенный набор объектов данных в основной памяти и обеспечить, чтобы данные действительно находились в основной памяти, когда мне это нужно, а не передавались на диск диспетчером виртуальной памяти?То есть, как я могу сделать это в Java?

Дополнительная информация: На объекты можно ссылаться с любым интервалом, например, дней или, скажем, лет друг от друга, чтобы быть немногоextreme: -)

EDIT : Я нашел это ТАК сообщение , которое спрашивает: «Вы можете хранить объекты в смежной памяти?»- Это не тот вопрос, который я задаю, хотя он мог бы помочь, если бы на объекты ссылались все время, я полагаю.И, кстати, ответ на этот вопрос был «нет», за исключением, очевидно, для типов значений в массивах.

Ответы [ 2 ]

1 голос
/ 23 января 2012

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

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

Грустно, но должно быть эффективно.

1 голос
/ 23 января 2012

Я сильно сомневаюсь, что вы можете сделать это только на Java. Возможно, вам придется использовать что-то вроде mlock через JNI, а также необходимые заклинания JNI для закрепления графов кэшированных объектов в памяти, чтобы GC не перемещал их. И [вставьте чудо здесь] , чтобы сжать закрепленную память в смежные страницы, потому что это то, над чем работает mlock.

...