首页 > 编程知识 正文

java解释器运行哪个字节码文件,java jvm面试题

时间:2023-05-04 02:58:42 阅读:109241 作者:1958

昨天,我看到了build Standalone的databrusher的脚本,Java类好像不在classpath中,好像可以一直运行。 抱着疑问,询问了对应的开发者,自己仔细看了那个代码,知道了原理。 命令位于$ Java _ home/xqdxlz/Java $ Java _ opts com.Alibaba.standalone.appstartorcom.Alibaba.intl.standalone 运行名为com.Alibaba.standalone.appstart or的class。 启动classloader并加载com.Alibaba.intl.standalone.datab rusher.start or。 积极的山被指定为WORLDS-INF目录的加载类。 然后,com.Alibaba.intl.standalone.datab rusher.start or将启动相应的“$main_class”. 然后,我仔细看了Java的classloader,了解了它的原理。 以下也简单总结一下吧。 java虚拟机由名为sun.misc.Launcher或java (或java.exe )的程序初始化。 虚拟机按以下顺序搜索和加载所有必需的类:1,引导类:是配置基本java平台类(如rt.jar和i18n.jar )的扩展类:使用java扩展机制的类在lib/ext的. jar包. 3中,没有使用用户类3360的开发者定义的类或Java扩展机制的第三方产品。 必须在命令行中使用-classpath选项或-classpath选项的Java类加载器概述如下图所示。 http://ren yongjie 668.blog.163.com/prevphdownload.do? host=ren yongjie 668 albumid=197449439 photoid=6568564371 bootstrap class loader

---扩展类加载器---系统类加载器虚拟机启动时,将首先执行初始化操作。 初始化动作完成后

生成第一个类加载器,即所谓的Bootstrap Loader。 Bootstrap Loader由c编写,该Bootstrap由

在Loader进行的初始作业中,除了基本的初始化动作外,加载定义为sun.misc也是最重要的

命名空间下的Launcher.java中的ext class loader (因为是inner class

所以编译后会变成Launcher$ExtClassLoader.class ),并设置其Parent

null表示父加载程序是引导加载程序。 然后,Bootstrap Loader请求在sun.misc中定义的加载

命名空间下的Launcher.java中的app class loader (因为是inner

因为是class,所以编译后会变成Launcher$AppClassLoader.class ),并设置其Parent

以前生成的ExtClassLoader实例。 a. Bootstrap ClassLoader/启动类加载器主要负责处理由java_home/jre/lib目录中的核心api或-Xbootclasspath选项指定的jar包装程序. b. Extension ClassLoader/扩展类加载器主要用于ext目录下的jar包或-Djava.ext.dirs指定目录下的jar包,用于c.system class loader 如果负责-DJAva.class.path或$CLASSPATH的$CLASSPATH为空,则缺省情况下,jdk将使用正在运行的Java类的当前路径作为缺省$CLASSPATH。 但是,如果设置$CLASSPATH变量,则会转至与$CLASSPATH对应的路径以查找对应的类,如果找不到,则会报告错误。 这个结论,我经过测试,看到了下一个类加载器的源代码。 (d. User Custom ClassLoader/用户定义的类加载器) java.lang.ClassLoader的子类)在程序运行时将java.lang.ClassLoader的子类添加到体现了java动态实时类读取特性。 为了获得更多的理解,编写了一个简单的java程序,测试了前面三种classloader可以加载类的路径及其parent类。 代码如下所示。 import java.net.URL;

import java.net.URLClassLoader;

//*

*

@className: IClassLoader

* @description: 测试三种classloader加载类的路径,及其parent

* @author: 笑遍世界

* @createTime: 2010-11-17 下午07:33:40

*/

public class IClassLoader {

public static void main(String[] args) {

//        测试bootstrap classloader 的类加载路径

URL[] urls=sun.misc.Launcher.getBootstrapClassPath().getURLs();

for (int i = 0; i < urls.length; i++) {

System.out.println(urls[i].toExternalForm());

}

//        测试extension classloader 的类加载路径,先打印一个路径,再打印出其parent,然后再打印出类加载路径中的所有jar包

System.out.println("-------------------------------------");

System.out.println(System.getProperty("java.ext.dirs"));

ClassLoader extensionClassloader=ClassLoader.getSystemClassLoader().getParent();

System.out.println("the parent of extension classloader : "+extensionClassloader.getParent());

System.out.println("extension classloader can use thess jars:");

URL[] extURLs = ((URLClassLoader)ClassLoader.getSystemClassLoader().getParent()).getURLs();

for (int i = 0; i < extURLs.length; i++) {

System.out.println(extURLs[i]);

}

//      测试system classloader 的类加载路径,其实也就时classpath的路径,并打印出它的parent

System.out.println("-------------------------------------");

System.out.println(System.getProperty("java.class.path"));

System.out.println(ClassLoader.getSystemResource(""));

ClassLoader systemClassloader=ClassLoader.getSystemClassLoader();

System.out.println("the parent of system classloader : "+systemClassloader.getParent());

}

}本机(linux+jdk1.5)运行结果如下:file:/usr/ali/java/jre/lib/rt.jar

file:/usr/ali/java/jre/lib/i18n.jar

file:/usr/ali/java/jre/lib/sunrsasign.jar

file:/usr/ali/java/jre/lib/jsse.jar

file:/usr/ali/java/jre/lib/jce.jar

file:/usr/ali/java/jre/lib/charsets.jar

file:/usr/ali/java/jre/classes

-------------------------------------

/usr/ali/java/jre/lib/ext

the parent of extension classloader : null

extension classloader can use thess jars:

file:/usr/ali/java/jre/lib/ext/djm.jar

file:/usr/ali/java/jre/lib/ext/localedata.jar

file:/usr/ali/java/jre/lib/ext/dnsns.jar

file:/usr/ali/java/jre/lib/ext/sunpkcs11.jar

file:/usr/ali/java/jre/lib/ext/sunjce_provider.jar

-------------------------------------

.:/usr/ali/java/lib/dt.jar:/usr/ali/java/lib/tools.jar

file:/home/master/workspace/2010_11/xqdxlz/

the parent of system classloader :  sun.misc.Launcher$ExtClassLoader@1a5ab41

//ps:当前路径.即是/home/master/workspace/2010_11/xqdxlz/关于Java的classloader其原理还是需要好好理解才能清楚的,仅通过一天的了解,记录为上面那么多吧。更多详细信息,可以参考如下资料:http://snandy.javaeye.com/blog/307083http://haofenglemon.javaeye.com/blog/426382http://blog.csdn.net/zdwzzu2006/archive/2008/04/05/2253982.aspxhttp://wuquanyin1011.javaeye.com/blog/703842http://hi.baidu.com/yangzhixqdxlz_bai/blog/item/78846cce1cb86b0992457ead.htmlhttp://www.blogjava.net/clraychen/archive/2008/02/20/180868.html

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。