在Android开发中,这意味着什么;调试器和垃圾收集器目前是松散集成的。”;

在Android开发中,这意味着什么;调试器和垃圾收集器目前是松散集成的。”;,android,multithreading,debugging,garbage-collection,Android,Multithreading,Debugging,Garbage Collection,在Android开发者网站的最底层,它说 调试器和垃圾收集器目前是松散集成的。VM保证在调试器断开连接之前,不会对调试器知道的任何对象进行垃圾收集。当调试器连接时,这可能会导致对象随时间累积。例如,如果调试器看到一个正在运行的线程,即使在线程终止后,关联的线程对象也不会被垃圾收集 那么这里的确切含义是什么呢?我是否可以假设: 线程内的任何日志调用都会导致该线程永远无法收集 在UI线程中存在的方法中的任何日志调用(从线程X中调用)都意味着永远不会收集线程X 方法中的任何日志调用,即使包含threa

在Android开发者网站的最底层,它说

调试器和垃圾收集器目前是松散集成的。VM保证在调试器断开连接之前,不会对调试器知道的任何对象进行垃圾收集。当调试器连接时,这可能会导致对象随时间累积。例如,如果调试器看到一个正在运行的线程,即使在线程终止后,关联的线程对象也不会被垃圾收集

那么这里的确切含义是什么呢?我是否可以假设:

  • 线程内的任何日志调用都会导致该线程永远无法收集
  • 在UI线程中存在的方法中的任何日志调用(从线程X中调用)都意味着永远不会收集线程X
  • 方法中的任何日志调用,即使包含thread或runnable的新实例的构造,也可能无法进行垃圾收集
  • 如果这是真的:

  • 只有当应用程序在AndroidManifest.xml中被显式标记为可调试时,这才适用吗

  • 即使设备未主动连接到调试器,它也适用吗

  • 除非当前附加了调试器,否则GC将正常运行。对日志的调用在任何方面都不是特别的。在附加调试器时,不能保证会收集任何对象,因为调试器可能会保留对它感觉像的任何对象的额外引用。一旦调试器断开连接,下一个GC将正常进行,并收集以前保留的对象。由于调试器可以执行其认为需要执行的任何操作,因此无法确切地说出哪些对象不会被收集


    仅仅读取logcat输出并不是“附加了调试器”。它特别指的是实际的Java调试器,例如设置断点、单步执行。

    “即使设备未主动连接到调试器,它也适用吗?”。不可以。这只是在附加调试器时。我认为日志不太可能保留对编写消息的线程的引用。