诛仙3充值回馈礼包:JVMTI 与 JVM-一懒众山小-搜狐空间

来源:百度文库 编辑:九乡新闻网 时间:2024/04/26 19:08:13
 在JVM源码发布以前,JVMPI以及后来的JVMTI是得以窥探JVM内部的最佳途径,大家可以用来看看不同的JVM在对JVM规范的实现方面的差异,以了解JVM在runtime时的行为,改进自己的程序。遗憾的是虽然到了JDK6,又增加了一些事件,但JVMTI提供的能监听的event总觉得还太少。
   现在SUN的JVM也开源了,大家可以改一个自己版本的JVM,可以很容易的看到更多的信息,不再受JVMTI的限制(当然最好还是按JVMTI的方式做extension),更可以看看常见的一些事件是什么时候从JVM这个盒子里给扔出来的。
   如VM Death这个事件,vm的退出有两条路经,一条是带error number的vm_exit(),一条是jni_DestroyJavaVM(). jni_DestroyJavaVM会由执行main()的线程在main执行完后调用(通常名为destroy helper, 尽管会有THREAD_START的event报出,却不是新的线程)。然后调用Threads.destroy_vm(),如果还有别的非deamon 线程运行则在此等待(deamon线程就不说了),如果没有别的non deamon线程,则继续执before_exit(),这时便抛出了两个事件:
  if (JvmtiExport::should_post_thread_life()) {
    JvmtiExport::post_thread_end(thread);
  }
  JvmtiExport::post_vm_death();
  一个是当前线程(helper)thread_end事件,一个是VM的death事件,可以看到vm_death是不需要enable的,而thread_end需要。
  然后调用thread->exit(true),再下来还有很多工作要做,如把线程从active list卸下,删除线程,tty等,就不详述了,有兴趣的可以自己去看看。

  对于一般的线程退出时也会调用thread->exit(),不过参数是false,并在其中抛出thread_end事件,如果它判断自己是最后一个非deamon的线程,则去通知可能在等待的destroy helper线程。也就是等所有线程都结束运行之后,JVM就会self-destroy。