2016-08-25 2 views
3

Сбой при работе с Android при запуске этой темы.Java - Сложность распределения памяти (GC_FOR_ALLOC)

В этой теме следует перезапустить телефон. Когда я начинаю его это не перезагрузить телефон и у меня есть следующий текст в LOG:

08-25 09: 12: 00,946 26029-26813/com.datasulting.chris.smsgateway D/dalvikvm : GC_FOR_ALLOC освобожден 1279K (30823), 55% бесплатно 4485K/9968K, приостановлено 53 мс, всего 53 мс 08-25 09: 12: 01.294 26029-26813/com.datasulting.chris.smsgateway D/dalvikvm: между предыдущий GC alloc 1280K 08-25 09: 12: 01.346 26029-26813/com.datasulting.chris.smsgateway D/dalvikvm: GC_FOR_ALLOC освобожденный 1280K (30820), 55% свободный 4485K/9968K, приостановлено 52 мс, всего 52 мс 08-25 09: 12: 01.713 26029-26813/com.datasulting.chris.smsgateway D/dalvikvm: между предыдущим GC alloc 1279K 08-25 09: 12: 01.768 26029-26813/com.datasulting.chris.smsgateway D/dalvikvm: GC_FOR_ALLOC освобожденный 1279K (30813), 55% свободный 4486K/9968K, приостановлено 55 мс, всего 55 мс 08-25 09: 12: 02.111 26029-26813/com.datasulting.chris.smsgateway D/dalvikvm: между предыдущим GC alloc 1279K 08-25 09: 12: 02.164 26029-26813/com .datasulting.chris.smsgateway D/dalvikvm: GC_FOR_ALLOC освобожден 1280K (30819), 55% бесплатно 4486K/9968K, приостановлено 53 мс, всего 53 мс 08-25 09: 12: 02.504 26029-26813/com.datasulting.chris.smsgateway D/dalvikvm: между предыдущим GC alloc 1279K 08-25 09: 12: 02.557 26029-26813/com.datasulting.chris.smsgateway D/dalvikvm: GC_FOR_ALLOC освобождено 1280K (30823), 55% бесплатно 4485K/9968K, приостановлено 53 мс, всего 53 мс 08-25 09: 12: 02.901 26029-26813/com.datasulting.chris.smsgateway D/dalvikvm: между предыдущим GC alloc 1279K 08-25 09: 12: 02.956 26029-26813/com.datasulting.chris.smsgateway D/dalvikvm: GC_FOR_ALLOC освобожденный 1279K (30818), 55% свободный 4485K/9968K, приостановлено 55ms, всего 55ms 08-25 09: 12: 03,298 26029-26813/com.datasulting.chris.smsgateway D/dalvikvm: между предыдущим GC Alloc 1280K

Это моя тема.

class Reboot implements Runnable { 

    private volatile boolean cancelled; 
    Boolean checkRebootHeb; 
    Boolean checkRebootQuo; 
    int jourDemandeeInt; 
    String jourDemandeeString; 
    String weekDay; 
    int dayOfWeek; 
    SimpleDateFormat df; 
    String heure; 
    String dayOfWeekString; 
    String heureDemandee; 
    Calendar c; 

    public Reboot(Boolean VARcheckReboot, Boolean VARcheckRebootQuo, int VARjour, String VARtextReboot) { 
     checkRebootHeb = VARcheckReboot; 
     checkRebootQuo = VARcheckRebootQuo; 
     jourDemandeeInt = VARjour; 
     heureDemandee = VARtextReboot; 
    } 


    @Override 
    public void run() { 

     while (!cancelled) { 

      if (jourDemandeeInt == 0){ 
       jourDemandeeString = "Lundi"; 
      } 
      if (jourDemandeeInt == 1){ 
       jourDemandeeString = "Mardi"; 
      } 
      if (jourDemandeeInt == 2){ 
       jourDemandeeString = "Mercredi"; 
      } 
      if (jourDemandeeInt == 3){ 
       jourDemandeeString = "Jeudi"; 
      } 
      if (jourDemandeeInt == 4){ 
       jourDemandeeString = "Vendredi"; 
      } 
      if (jourDemandeeInt == 5){ 
       jourDemandeeString = "Samedi"; 
      } 
      if (jourDemandeeInt == 6){ 
       jourDemandeeString = "Dimanche"; 
      } 

      c = Calendar.getInstance(); 
      dayOfWeek = c.get(Calendar.DAY_OF_WEEK); 
      df = new SimpleDateFormat("HH:mm"); 
      heure = df.format(c.getTime()); 


      if (Calendar.MONDAY == dayOfWeek) weekDay = "Lundi"; 
      else if (Calendar.TUESDAY == dayOfWeek) weekDay = "Mardi"; 
      else if (Calendar.WEDNESDAY == dayOfWeek) weekDay = "Mercredi"; 
      else if (Calendar.THURSDAY == dayOfWeek) weekDay = "Jeudi"; 
      else if (Calendar.FRIDAY == dayOfWeek) weekDay = "Vendredi"; 
      else if (Calendar.SATURDAY == dayOfWeek) weekDay = "Samedi"; 
      else if (Calendar.SUNDAY == dayOfWeek) weekDay = "Dimanche"; 


      dayOfWeekString = String.valueOf(dayOfWeek); 

      if (checkRebootQuo == true) { 
       if (heure.equals(heureDemandee)) { 
        try { 

         Process proc = Runtime.getRuntime().exec(new String[]{"su", "-c", "reboot"}); 
         proc.waitFor(); 
        } catch (Exception ex) { 
         ex.printStackTrace(); 
        } 
       } 
      } 

      if (checkRebootHeb == true) { 
       if (dayOfWeekString.equals(jourDemandeeString)) { 
        if (heure.equals(heureDemandee)) { 
         try { 

          Process proc = Runtime.getRuntime().exec(new String[]{"su", "-c", "reboot"}); 
          proc.waitFor(); 
         } catch (Exception ex) { 
          ex.printStackTrace(); 
         } 
        } 
       } 
      } 

     } 


    } 

    public void cancel() { 
     cancelled = true; 
    } 
} 
+0

Большое спасибо и извините за мой английский: p –

ответ

0

Многое не так с этим кодом.

Ваша основная проблема - ваша нить выполняет «активное» ожидание. Это означает: он просто зацикливается и создает новый объект Calendar каждую итерацию. Затем вы немедленно выбросите этот объект и создадите новый.

И вы удивлены, что сборщик мусора с трудом справляется с вашим кодом? И просто чтобы быть уверенным, что мой сарказм не мешает людям понять проблему: никакой сборщик мусора в мире не предназначен для создания «горячей» петли, которая создает только мусорные объекты; особенно в «мобильном» мире.

Итак, очевидный ответ: добавьте Thread.sleep() в теле вашего цикла; как:

  • проверить, если его час перезагружать
  • если да: перезагрузка
  • , если нет: сон в течение минуты
  • повтор

Ваш код делает: - проверить, его час для перезагрузки - если да: перезагрузка - повтор

Затем, s ome общая обратная связь по вашему (извините) ужасный код:

  • Это абсолютно безумно, что вы переводите будни в французские строки, чтобы их сравнить. У вас уже есть int, который говорит 0 в понедельник. Затем просто спросите объект календаря для дня недели как int. Вы конвертируете 0 в «Lundi», чтобы снова преобразовать 0 в «Lundi», чтобы совместить строку. Сумасшедший.
  • Ваше имя ужасно. Действительно - придерживайтесь одного языка. Я думаю, что «checkRebootQuo» - это «почасовая перезагрузка»; тогда как «checkRebootHeb» примерно еженедельно перезагружается. Если вы переименуете свои переменные в «rebootHourly» и «rebootWeekly» ... это будет намного яснее.
  • И наконец: не используйте несколько логических параметров, чтобы затем иметь несколько IFs в ваших методах. Вместо этого используйте полиморфизм. У вас есть базовый класс, который знает, что нужно выполнить цикл и перезагрузиться; и затем имеют два подкласса; тот, который знает, как перезагружаться в следующий час, и еще один, который перезагружается в указанный день недели.
+0

Спасибо, но я не думаю, что это решит проблему. Эта тема иногда запускается целую неделю. Я думаю, что это решение решит проблему, но только на мгновение. –

+0

У вас проблемы с памятью, потому что вы, вероятно, создаете ** много миллионов ** объектов в минуту. Вы постоянно взбиваете GC. Когда вы добавляете спящий режим, вы уменьшаете количество новых объектов до ОДНОГО в минуту. Вы знаете, что поняли? – GhostCat

+0

Хорошо, я вижу, спасибо за предложения! –

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