一次编译到处执行是Java的一个很大的卖点,通过一段代码来了解在Java内是如何被加载和执行的,如在应用代码里面去调用 new Gson(). from Json(..);然后有一个new byte code会触发loadClass()机制,还要去找”com.google.gson.Gson”用loadClass方法,去找Jar,因为应用的class 下有很多Jar包,如commons-io.jar、myaql-connector.jar、gson.jar,找到gson.jar里面有com.google/gson/Gson.class文件,然后会把 Class给读出来,读成一个byte的数组,调用一个define class JVM的接口,define class会进行parse、verify、link,调出 ,最终达到一个可以让Jvm识别的 byte code,Jvm解释器会去执行byte code到2000次以后,会运行一个client compiler让代码编译到c1级别,c1级别其实已经在native执行了,同时会收集一些provide信息,帮助编译到更高的优化级别c2,然后到15,000次以后会进入到最快的c2级别,interpret和c2之间可能大概有50倍的差距,所以Java1开始是很慢的,但只要跑稳后是非常快的。
通过上述,一段代码想要被执行,生命周期是非常长的,优点是这种跨平台性,可以收集的信息越跑越快,缺点就是Java代码装载的开销非常大。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。