2010-10-19 3 views
0
static private  ArrayList seriesColors  = new ArrayList(); 

public Audiogram(int widthParm, int heightParm) 
      throws Exception 
    { 
     super(widthParm, heightParm); 
     seriesColors.add(new Color( 0, 0, 255)); 

     // Set the default settings to an industrial audiogram 
     setType(INDUSTRIAL_AUDIOGRAM); 
    } 

У меня есть около пяти методов, подобных этому, но хотелось бы знать, может ли этот код вызвать утечку памяти, поскольку seriesColors является статическим.имеет ли этот код утечку памяти?

Если есть утечка памяти, то для чего это решение?

private static final ColorModel rgbModel = ColorModel.getRGBdefault(); 

public void setPixels(int x, int y, int w, int h, ColorModel model, int[] pixels, int off, int scansize) 
    { 
     if (model == rgbModel) { 
      try { 
       encodePixelsWrapper(x, y, w, h, pixels, off, scansize); 
       } 
      catch (IOException e) { 
       iox = e; 
       stop(); 
       return; 
       } 
      } 
      else { 
       int[] rgbPixels = new int[w]; 
       for (int row = 0; row < h; ++row) { 
        int rowOff = off + row * scansize; 
        for (int col = 0; col < w; ++col) { 
         rgbPixels[col] = model.getRGB(pixels[rowOff + col]); 
         } 
        try { 
         encodePixelsWrapper(x, y + row, w, 1, rgbPixels, 0, w); 
         } 
        catch (IOException e) { 
         iox = e; 
         stop(); 
         return; 
         } 
        } 
       } 
    } 

public static ColorModel getRGBdefault() { 
    if (RGBdefault == null) { 
     RGBdefault = new DirectColorModel(32, 
          0x00ff0000, // Red 
          0x0000ff00, // Green 
          0x000000ff, // Blue 
          0xff000000 // Alpha 
         ); 
    } 
    return RGBdefault; 
    } 

Из этих двух кодов, имеющих серьезные недостатки?

+0

«Это мой второй пост по тому же вопросу». - lol – aioobe

+0

, но оба звучат разные ... – John

+0

@ Джон - вы пробовали инструмент для проверки, например OptimizeIt? – justkt

ответ

1

Статические переменные являются общими для всех экземпляров класса. (Экземпляр создается с использованием оператора «новый».)

В этих примерах; вероятно, не рекомендуется использовать статическую (переменную экземпляра) для хранения цветов, поскольку экземпляры будут мешать друг другу. Эта переменная должна быть заменена на «обычную» переменную экземпляра.

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

Обратите внимание, что первая проблема не является «утечкой памяти». Вы можете сказать, что экземпляры hte непреднамеренно представляют собой утечку данных между ними, но это не классическая утечка памяти, когда активные объекты неинтентифицируют ссылки на «мертвые» объекты.

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

1

Зачем вам делать два сообщения за тот же вопрос? Что касается вашего вопроса, то в общем случае статические переменные-члены могут вызывать утечку памяти, если не обрабатываться должным образом. Правильно я имею в виду, что эти переменные живут до тех пор, пока приложение работает, и вы должны позаботиться о том, чтобы, например, arraylist удалял предметы, которые больше не нужны.

0

Коллекция, использующая слабые ссылки, как правило, является решением проблемы в вашем первом примере.

См: http://download.oracle.com/javase/1.4.2/docs/api/java/lang/ref/WeakReference.html

+0

Возможно, нет; но, пожалуйста, объясните, что я пропустил ... – KarlP

+0

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

0

Что касается вашего первого вопроса, трудно сказать, будет ли seriesColors создавать существенную проблему с памятью, не зная больше о том, как работает остальная часть программы. Например, удалены ли объекты из серии «Цвета»? Как часто создается новая аудиограмма? Сколько аудиограмм будет создано во время работы программы? И т.д.

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