Entitymanager, вызывающий утечку памяти?

По моему опыту, PIL / Pillow (в дальнейшем просто «Pillow») может вести себя совсем иначе с маленькими изображениями, чем с большими - не только в операциях изменения размера, но и вообще - но так что вы могли бы также протестировать все методы, которые предлагает Pillow, например:

# q.v. https://gist.github.com/fish2000/d85befaf289c664b6a9f44d1b56e57da#file-asscat-py-L129-L134

from PIL import Image

# q.v. PIL.Image constants of the same (yet uppercased) names:
interpolation_methods = frozenset({
                          "box",
                          "bilinear", "bicubic",
                          "hamming", "lanczos",
                          "nearest" })

def interpol(name):
    """ Return a PIL/Pillow image interpolation method constant by name """
    return getattr(Image, name.upper())

size    = (26, 26)
avatar  = Image.open(…) # load your source avatar image
methods = (interpol(method) for method in interpolation_methods)
scaled  = (avatar.resize(size, resample=method) for method in methods)

# you can save these out for more granular inspection:
previews = list(scaled)
for preview in previews:
    preview.show()

… имейте в виду, что Image.NEAREST может дать удивительно приличные результаты для небольших размеров - это и тот факт, что Pillow никоим образом не является Adobe® Photoshop ™, и, таким образом, на самом деле не может быть поставлена ​​задача воспроизвести результаты, которые вы, возможно, получили из того же.

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

9
задан GBa 1 April 2009 в 16:02
поделиться

4 ответа

Менеджеры Entity должны обычно иметь тот же жизненный цикл как приложение и не создаваться или уничтожаться на основе на запрос.

Ваша "утечка памяти" может быть не чем иным как кэшированием, которое делает JPA. Вы не говорите, какого поставщика JPA Вы используете, но я знаю на основе опыта, что EclipseLink по умолчанию делает обширное кэширование (который является частью предполагаемых преимуществ JPA и ORM в целом).

Как Вы знаете, что у Вас есть утечка памяти?

1
ответ дан 4 December 2019 в 21:51
поделиться

Проверьте, является ли это действительно утечкой

раз так получите Память Eclipse Анализатор и проанализируйте его.

Сообщения в блоге здесь могли бы также быть полезными.

1
ответ дан 4 December 2019 в 21:51
поделиться

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

Я рекомендовал бы использовать что-то как OpenEJB или Springframework для управления EntityManager/EntityMangerFactory для Вас.

1
ответ дан 4 December 2019 в 21:51
поделиться

Как сказал @Ruggs, если вы сами управляете жизненным циклом EntityManager (в отличие от того, чтобы CMP Container Managed Persistence выполнял J2EE), вам необходимо закрыть EntityManager самостоятельно или, по крайней мере, вызовите EntityManager.clear () , чтобы отсоединить объекты.

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

Все объекты, которые загружаются / сохраняются через EntityManager, остаются в памяти до тех пор, пока вы явно не отсоедините от него объекты (через EntityManager.detach () или EntityManager.clear () или EntityManager.close () ). Так что лучше иметь недолговечные EntityManager. Если вы сохраняете 1000000 объектов через один и тот же EntityManager, не отсоединяя их после того, как вы получите OOME (не имеет значения, сохраняете ли вы каждый объект в его собственном EntityTransaction).

Все это объясняется в этой публикации http://javanotepad.blogspot.com/2007/06/how-to-close-jpa-entitymanger-in-web.html .

В качестве примера (взятого из предыдущего сообщения), если вы хотите избежать «утечек памяти», вы должны сделать что-то вроде этого (если вы не используете CMP):

EntityManager em = emf.createEntityManager();

try {
  EntityTransaction t = em.getTransaction();
  try {
    t.begin();  
    // business logic to update the customer
    em.merge(cust);
    t.commit();
  } finally {
   if (t.isActive()) t.rollback();
  }
} finally {
  em.close();
}
6
ответ дан 4 December 2019 в 21:51
поделиться
Другие вопросы по тегам:

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