Минимизация накладных расходов памяти данных приложения в процессах Java

Мне нужно хранить много данных (объектов) в памяти (для вычислений).
Поскольку вычисления выполняются на основе этих данных, крайне важно, чтобы все данные находились в одной и той же памяти процесса JVM.
Большая часть данных будет построена из строк, целых чисел и других подобъектов (коллекций, HashSet и т. Д.).
Поскольку затраты памяти Java-объектов значительны (строки UTF-16, каждый объект имеет 8-байтовые служебные данные) Я ищу библиотеки, которые позволяют хранить такие данные в памяти с меньшими издержками.
Я прочитал интересные статьи о сокращении памяти:
* http: //www.cs.virginia. Edu /ким /реклама /pldi09tutorials /эффективно использует память-Java-tutorial.pdf * http://blog.griddynamics.com/2010/01 /java-tricks-Reduction-memory-потребление.html

Мне просто интересно, есть ли какая-нибудь библиотека для таких сценариев, или мне нужно начинать с нуля.
Чтобы лучше понять мое требование, представьте сервер, который обрабатывает большой объем записей и должен анализировать их на основе миллионов других записей, которые хранятся в памяти (для высокой скорости обработки).

7 голосов | спросил Avner Levy 5 Jpm1000000pmSat, 05 Jan 2013 21:13:50 +040013 2013, 21:13:50

3 ответа


0

для сбора служебных данных посмотрите trove - их объем памяти меньше, чем во встроенной Коллекции классов (особенно для карт и наборов, которые в JDK основаны на картах).
если у вас есть большие объекты, может быть целесообразно сохранить их «сериализованными» как некоторое компактное двоичное представление (не сериализацию Java) и десериализовать обратно в полноценный объект при необходимости) - вы также можете использовать библиотеку кеша, которая может отображать страницы на диск? взгляните на infinispan или EHCache . Кроме того, некоторые из этих библиотек (в том числе ehcache, если память служит) предоставляют «хранилище вне кучи» как часть вашего процесса jvm - кусок памяти, не подчиняющийся GC, управляемый (нативной) библиотекой. если у вас есть эффективное бинарное представление, вы можете хранить его там (не снизит вашу рабочую силу, но может заставить GC вести себя лучше)

ответил radai 5 Jpm1000000pmSat, 05 Jan 2013 21:15:40 +040013 2013, 21:15:40
0

Для бита String вы можете сохранить байт [], полученный из String.getBytes ("UTF8"). Если вам снова потребуется объект String, вы можете создать его снова из ByteArray. Это, конечно, потребует еще больше процессора для создания объектов String снова и снова, так что это будет компромисс между скоростью <->

ответил JoG 5 Jpm1000000pmSat, 05 Jan 2013 21:45:17 +040013 2013, 21:45:17
0

Что касается строк, также посмотрите параметр -XX: + UseCompressedStrings jvm, но похоже, что он был удален из последних обновлений jvm, см. этот другой вопрос

ответил Persimmonium 5 Jpm1000000pmSat, 05 Jan 2013 21:41:33 +040013 2013, 21:41:33

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132