2015-01-09 2 views
0

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

Мой технический стек heroku/playframework 1.2.7/mongodb (compose.io)

Основной образец у меня есть:

public class Product{ 

    public productName; 
    public productDesc; 
    public productPrice; 

    private static final Product INSTANCE = new Product(); 

    public static Product instance() { 
     return INSTANCE; 
    } 

    // an example (not actual) method is 
    public List<Product> listAllProducts(String brand, String category){ 
     //not the actual DB code 
     Db.connect().find(Product.class).listAllItems(brand, category); 
    } 

} 

, который я использую как этот

List<Product> products = Product.instance().listAllProducts("hugo-boss", "jeans"); 

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

Благодарим за помощь.

ОБНОВЛЕНИЕ Выполнение heroku config:set _JAVA_OPTIONS="-Xms256m -Xmx384m -Xss512k -XX:+UseCompressedOops" не работает пока.

я включил один из дополнений, которые дают информацию памяти в журналах, вот что я получаю:

2015-01-09T16:18:58.614435+00:00 heroku[web.3]: source=web.3 dyno=heroku.18312286.ad920471-c3dd-4d5d-a55b-28ea79905c14 sample#load_avg_1m=3.65 
2015-01-09T16:18:58.614631+00:00 heroku[web.3]: source=web.3 dyno=heroku.18312286.ad920471-c3dd-4d5d-a55b-28ea79905c14 sample#memory_total=439.86MB sample#memory_rss=438.86MB sample#memory_cache=1.00MB sample#memory_swap=0.00MB sample#memory_pgpgin=138042pages sample#memory_pgpgout=25438pages 
2015-01-09T16:19:10.683077+00:00 heroku[web.2]: source=web.2 dyno=heroku.18312286.910cbbef-7613-4daf-a856-230e08618cc7 sample#load_avg_1m=1.90 sample#load_avg_5m=0.86 
2015-01-09T16:19:10.683364+00:00 heroku[web.2]: source=web.2 dyno=heroku.18312286.910cbbef-7613-4daf-a856-230e08618cc7 sample#memory_total=367.73MB sample#memory_rss=365.02MB sample#memory_cache=2.71MB sample#memory_swap=0.00MB sample#memory_pgpgin=141344pages sample#memory_pgpgout=47205pages 
+0

Если ответ отрицательный, это должно быть хорошо, тогда, пожалуйста, не стесняйтесь сказать мне об этом. – Ankur

+0

Возможно, это может помочь: http://stackoverflow.com/questions/6470651/creating-a-memory-leak-with-java – user2570465

+0

Попробуйте запустить консоль JVM, а затем запустите приложение: вы должны увидеть, где память идет. – davek

ответ

0

Там нет утечки здесь. По крайней мере, не в коде, который вы опубликовали. Но, в зависимости от того, насколько велик ваш список и как с большой кучей вы работаете, вы можете запускать OOM просто потому, что одновременно пытаетесь создать несколько копий списка «allProducts».

Возможно, лучше кэшировать список «всех продуктов» и позволить всем клиентам использовать этот единственный экземпляр?

+0

. Обычно продукты извлекаются на основе таких ценностей, как компания, категория и т. Д. - Неужели это изменит ситуацию? – Ankur

+0

Нет. Это не приведет к утечке памяти. –

Смежные вопросы