Цикл Java в потоках - PullRequest
       11

Цикл Java в потоках

0 голосов
/ 02 июля 2010

Я написал программу на Java, которая имеет 5 потоков.В run () у меня есть цикл while, который будет повторяться снова и снова, и этот цикл будет повторяться много раз.

Во время работы программы она постепенно ест оперативную память, что приводит к ползанию программы.Могу ли я в любом случае остановить его, съев весь свой баран?

Редактировать:
На самом деле, просто думая об этом, это, вероятно, потому, что цикл создает много объектов.Должен ли я = обнулить эти объекты в конце цикла while ??

Ответы [ 5 ]

8 голосов
/ 02 июля 2010

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

Что вам нужно сделать, это убедиться, что вы не сохраняете лишние ненужные объекты.

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

3 голосов
/ 02 июля 2010

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

Конечно.Измените код так, чтобы он занимал меньше оперативной памяти.

1 голос
/ 02 июля 2010

Вам может понадобиться анализатор памяти, чтобы понять, что такое «поедание оперативной памяти». Есть много доступных инструментов. Один коммерческий инструмент - JProfiler .

Простой и бесплатный инструмент - использовать Sun Profiler, поставляемый с Java VisualVM. Если у вас установлен JDK 6, возможно, эта программа уже установлена ​​на вашем компьютере. Запустите C: \ Program Files \ Java \ jdk1.6.0_16 \ bin \ jvisualvm.exe. Подключитесь к запущенному процессу Java и нажмите вкладку «Профилировщик» и кнопку «Память». Теперь вы можете видеть, какие объекты у вас есть и сколько памяти они используют. Нажмите обновить, чтобы обновить вид.

1 голос
/ 02 июля 2010

Это нормально для каждого вашего потока иметь бесконечный цикл while, но простое использование циклов while не потребляет больше оперативной памяти.

new Thread(new Runnable() {
    public void run() {
        try {
            while (true) {
                // do some work
            }
        } catch(InterruptedException ex) {}
    }
}).start();

Вы что-то делаете для использования ОЗУ, поэтому вы должны отладить приложение и найти причину увеличения использования ОЗУ.

Обновление:

Вам не нужно делать объекты null в конце цикла ... если вы не держитесь за ссылку на эти объекты, сборщик мусора должен их очистить. Что вы делаете с объектами после их создания? Сколько оперативной памяти вы используете?

1 голос
/ 02 июля 2010

В ответе @Michael Borgwardt постарайтесь свести к минимуму создание новых объектов.Если вы можете повторно использовать один и тот же объект вместо создания новых каждый раз, вы можете сохранить там некоторую память.

Но, как говорили другие, не видя ваш код, мы просто догадываемся.

...