2015-02-11 2 views
-9

Как уменьшить утечку памяти в приложении Java?Как уменьшить утечку памяти в java?

Утечка памяти в Java может произойти, если вы забудете закрыть ресурс, или ссылка на объект не будет выпущена.

Кодекс:

import java.util.Map; 
public class MemLeak { 
public final String key; 
public MemLeak(String key) { 
    this.key = key; 
} 

public static void main(String args[]) { 
    try { 
     Map map = System.getProperties(); 
     for(;;) { 
     map.put(new MemLeak("key"), "value"); 
     } 
    } catch(Exception e) { 
     e.printStackTrace(); 
    } 
    } 
} 
+3

Я не вижу вопроса в этом сообщении. Какой у Вас вопрос? – amit

+8

Это не память * утечка *. Вы поддерживаете ссылки на записи, которые вы добавляете. Вы бесконечно * потребляете память, но это не утечка. В чем смысл этой программы? –

+0

это не вопрос – Mysterion

ответ

2

позволяет анализировать некоторые из возможных сообщений об ошибках:

java.lang.OutOfMemoryError: Java heap space 
java.lang.OutOfMemoryError: PermGen space 
java.lang.OutOfMemoryError: Requested array size exceeds VM limit 
java.lang.OutOfMemoryError: request <size> bytes for <reason>. Out of swap space? 
java.lang.OutOfMemoryError: <reason> <stack trace> (Native method) 

Вот класс MemLeak:

package com.post.memory.leak; 

import java.util.Map; 

public class MemLeak { 
    public final String key; 

    public MemLeak(String key) { 
     this.key =key; 
    } 

    public static void main(String args[]) { 
     try { 
      Map map = System.getProperties(); 

      for(;;) { 
       map.put(new MemLeak("key"), "value"); 
      } 
     } catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Примечание: утечки памяти не из-за бесконечную петлю на линии 14: бесконечный цикл может привести к истощению ресурсов, но не к утечке памяти. Если бы мы правильно реализовали методы equals() и hashcode(), код будет работать нормально даже с бесконечным циклом, поскольку у нас будет только один элемент внутри HashMap.

3

"как уменьшить утечку памяти в приложении Java?" - Не делайте такие вещи!

Ваше приложение пытается создать бесконечную структуру данных в куче. Куча фундаментально и неизбежно конечна.

Это не сработает.


Утечка памяти в Java может произойти, если вы забыли закрыть ресурс или ссылка на объект не выделяется.

Сомнительно, квалифицируется ли это применение в качестве «утечки памяти». Если вы случайно сделали что-то подобное, то это можно было бы назвать утечкой. Но ваш код делает это с тем, что кажется преднамеренным намерением.


Я предполагаю, что вы понимаете, почему это создает бесконечную структуру данных. Это потому, что ваш класс MemoryLeak наследует equals и hashcode от Object. Это означает, что равенство совпадает с идентификатором объекта, и поэтому каждый экземпляр MemoryLeak становится отдельным ключом на карте. Следовательно, вы просто добавляете все больше и больше записей на карту, пока не исчерпаете память.

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