【问题标题】:Destroying Date object销毁日期对象
【发布时间】:2017-09-03 13:28:56
【问题描述】:

我需要一些关于这段代码的建议:

Thread myClock = new Thread() {
  @Override
  public void run() {
    try {
      while (!isInterrupted()) {
        Thread.sleep(1000);
        runOnUiThread(new Runnable() {
          @Override
          public void run() {
            Date dt = new Date();
            SimpleDateFormat myClockDate = new SimpleDateFormat("EEE, dd MMM yyyy");
            SimpleDateFormat myClockTime = new SimpleDateFormat("hh:mm aa");
            myClock_date.setText("Date:  " + myClockDate.format(dt));
            myClock_time.setText("Time:  " + (myClockTime.format(dt)).replace(".", ""));
          }
        });
      }
    } catch (InterruptedException e) {

    }
  }
};

它运行良好,但是当线程运行时,内存监视器显示使用率持续上升和下降。不运行时,显示器呈扁平状。

我想知道是否是导致此问题的日期对象的持续创建?是否需要销毁或释放?

PS:GPU 监视器已被禁用。

【问题讨论】:

  • 不要在“while”中创建任何对象。
  • 嗨,克里姆。那么,WHILE 循环中应该保留什么?这是必需的,对吧?
  • 你为什么担心?我想我不会。
  • 我没有看到避免在每次迭代中创建Date 的直接方法@KerimFIRAT。当然,这两个SimpleDateFormat 对象可以在循环之前创建一次。
  • 顺便说一下,您正在使用的麻烦的遗留日期时间类是不是线程安全的。使用它们的替代品,线程安全的java.time 类。

标签: java android multithreading date java-threads


【解决方案1】:

您的代码每秒都会创建一个 Runnable、一个 Date 和两个 DateFormat 对象。字符串操作也可能会创建一些对象。一旦 Runnable 完成,它们就会被切断(Runnable 之外的任何东西都没有引用它们中的任何一个)并且有资格进行垃圾收集。你不需要做任何进一步的事情来释放他们的记忆。在每个 Runnable 完成后,您应该会看到内存使用率恢复到相同的水平。

垃圾收集不是即时的。只要您没有看到持续的上升趋势就可以了。

【讨论】:

  • 嗨内森。实际上,它达到了一些限制并再次下降 - 但不是在每个可运行的完成时(每秒)。没关系?
  • 对我来说听起来完全正常,@iSofia。垃圾收集器可能不是每秒都运行。不过,它应该在需要内存时运行。只有这样,内存消耗才会下降。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-11
  • 2013-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-27
相关资源
最近更新 更多