finalizer启动线程
  在上面的线程,在相应的进程启动过程中会被启动.可以理解为,对象通过调用register(object)触发finalizer类的初始化.然后,在静态初始化块当中,会启动相应的回收线程.相应的初始化代码如下所示:
static {
ThreadGroup tg = Thread.currentThread().getThreadGroup();
for (ThreadGroup tgn = tg;
tgn != null;
tg = tgn, tgn = tg.getParent());
Thread finalizer = new FinalizerThread(tg);
finalizer.setPriority(Thread.MAX_PRIORITY - 2);
finalizer.setDaemon(true);
finalizer.start();
}
  上面的static是静态初始化块,即只要类Finalizer被使用,即会触发相应的调用.这里使用的线程组是系统线程组,优先级也还算高,被配置为后台线程.
  在使用jstack打印线程时,出现的如图下所示的线程,即是由这里来启动的.如下图所示

  总结
  整个Finalizer即是通过finalReference,由JVM和相应的java类相互配合来协同工作.并不是全部由jvm实现,因此可以认为其也并不是太底层的东西,而是为了实现相应的语义.一切都是正常的java来完成,由jvm配合.了解到整个过程,也是对java本身的运行机制有所了解.