Как я могу узнать, сколько памяти используют мои кэшированные объекты? - PullRequest
0 голосов
/ 01 июня 2011

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

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

Итак, у меня есть вопрос по этому вопросу:

  1. Как узнать, сколько памяти использует список? (Я использовал метод, в котором мы используем сборщик мусора для сбора памяти и определения различий, но есть много списков, поэтому это занимает слишком много времени)

  2. Как мне оптимизировать список обновлений?

Спасибо за помощь.

Ответы [ 5 ]

2 голосов
/ 01 июня 2011

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

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

Но до этого любая загрузка базы данных будет включать в себя итерацию по набору результатов, поэтому самая большая оптимизация, которую вы можете сделать, - это уменьшить размер наборов результатов. Есть несколько способов сделать это:

  1. если вы используете карту, попробуйте использовать ключи, которые не требуют загрузки, и выполняйте загрузку, когда вы пропустите.
  2. после загрузки обновите только те строки, которые изменились с момента последней загрузки данных, хотя это явно не решает проблему запуска.

Теперь, несмотря на все сказанное, я бы не рекомендовал вам сначала писать свой собственный код для кеширования. Я говорю это по следующим причинам:

  1. весь современный кэш СУБД, поэтому при условии, что ваши запросы производительны, получение фактического набора результатов не должно быть узким местом.
  2. Hibernate предоставляет не только ORM, но и надежное и понятное решение для кэширования.
  3. если вам действительно нужно кэшировать массивные наборы данных, используйте Coherence или аналогичные - кеш можно запустить в отдельной JVM, и ваше приложение не должно выдерживать нагрузку.
2 голосов
/ 01 июня 2011

как узнать, сколько памяти использует список

как я могу оптимизировать список обновлений.

Убедитесь, что вы используете правильный тип сбора для ваших данных.Взгляните здесь .

Также взгляните на Коллекции гуавы .


И еще одна вещь, ignis это очень правильно, советуя вам не использовать System.gc() это может быть самой причиной ваших проблем с производительностью. Вот почему .

1 голос
/ 01 июня 2011

У вас есть две проблемы: выяснить, сколько памяти используется, и управлять кешем. Я не уверен, что они действительно тесно связаны, хотя они могут быть.

Узнать, сколько памяти использует объект, не так уж сложно: одна превосходная статья, которую вы можете использовать для справки, - это " Sizeof for Java " от JavaWorld. Он избегает всего фиаско сборки мусора, в котором есть множество дыр (он медленный, он не считает объект, а кучу - это означает, что другие объекты учитывают ваши результаты, которые вы, возможно, не хотите, и т. Д.)

Управление временем для инициализации кэша является еще одной проблемой. Я работаю в компании, у которой есть сетка данных как продукт, и поэтому я предвзят; будь в курсе.

Одна опция вообще не использует кеш, а использует сетку данных. Я работаю на GigaSpaces Technologies , и я чувствую, что наши лучшие; мы можем загружать данные из базы данных при запуске и хранить ваши данные там как распределенное транзакционное хранилище данных в памяти (так что ваша самая большая стоимость - доступ к сети). У нас есть версия для сообщества, а также полнофункциональные платформы, в зависимости от вашей Нужен и бюджет. (Выпуск для сообщества бесплатный.) Мы поддерживаем различные протоколы, включая JDBC, JPA, JMS, Memcached, API-интерфейс Map (аналогичный JCache) и собственный API.

Другие подобные опции включают Coherence, которая сама является сеткой данных, и Terracotta DSO, которая может распределять граф объектов в куче JVM.

Вы также можете посмотреть на сами проекты кеша: два включают Ehcache и OSCache. (Опять же: предвзятость. Я был одним из тех, кто запустил OpenSymphony, поэтому у меня есть слабое место для OSCache.) В вашем случае, что произойдет, это не предварительная загрузка кеша - обратите внимание, что я не знаю вашего приложения так что я догадываюсь и могу ошибаться - но кеш по запросу. Когда вы получаете данные, вы сначала проверяете кеш на данные и извлекаете их из БД, только если данные не находятся в кеше, и загружаете кеш при чтении.

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

0 голосов
/ 01 июня 2011

Я склонен использовать YourKit для такого рода вещей. Это стоит денег, но IMO стоит каждого копейки (без подключения, кроме как в качестве клиента).

0 голосов
/ 01 июня 2011

Имейте в виду, что вызывать

System.gc()

или

Runtime.getRuntime().gc()

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

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