2013-11-22 6 views
-1

Это странно: Когда я начинаю график, используя timer.scheduleAtFixedRate, это занимает много времени, а затем бросает OutOfMemoryError: Java heap space, но если я просто назвал timerTask.run() методом в основном потоке, он прекрасно работает ,OutOfMemoryError Java куча пространства при использовании TimerTask

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

Большое спасибо!

Фрагмент кода так же просто следующим образом:

Timer timer = new Timer(); 
TimerTask task = new TimerTask() { 
    @Override 
    public void run() { 
     AModule.load(tmpFilePath); //not open-source 
    } 
} 
timer.scheduleAtFixedRate(task, new Date(), 1*60*1000); //OOME 
//If I change the upper code to: 
task.run() //it just works fine 
+0

показать ваш код, чтобы мы могли воспроизвести проблему. – Masudul

+2

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

+0

Отправьте код для нас. И, возможно, проверьте рекурсивные вызовы или на стойкие к памяти экземпляры (завершите/закройте ресурсы, большие объекты и т. Д.). – LastFreeNickname

ответ

0

Таймер AWT работает в своем собственном потоке. Если на «основной поток» вы имеете в виду поток пользовательского интерфейса или очереди событий, затем:

Возможно, ваш замкнутый исходный код с доступом к Свинг как некоторые. Компоненты Swing должны быть доступны только из потока событий. У вас могут возникнуть проблемы при запуске в таймере, но вы всегда будете нормально работать в своем основном потоке.

Если это так, вам повезло. Обычно работает Calling Swing из другого потока. У меня никогда не бывает проблем до тех пор, пока я не демонтирую или клиент не попытается его использовать. И проблемы часто не повторяются.

+0

Нет 'swing' bro. Я просто использую пружину и командную строку для запуска моего кода. – Judking

+0

@Judking: стоит попробовать. Хммм. Я все еще думаю, что проблема с таймером - проблема. Вы используете какой-либо другой код в основном потоке, который может взаимодействовать с кодом, который вы используете в таймере? (Не может быть потокобезопасным?) В частности, если код в вашем основном потоке устанавливает значение энергонезависимого поля вне блока синхронизации, код в таймере _ будет видеть старое значение_. Должно быть хорошо, если оно устанавливает значение, тогда вы запускаете таймер, но если вы запустите таймер, установите значение, каждый поток _can_ будет иметь собственное значение. (Вам нужно открыть исходный код здесь!) – RalphChapin

+0

Это не так сложно, тестовый код почти такой же, как и мой фрагмент кода выше. О, вот некоторые успехи в этой проблеме: когда я устанавливаю -Xmx1024M в аргументах VM, он отлично работает при использовании timertask. – Judking

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