1. jdk,jre,jvm关系
jdk包含java开发工具包(java.exe等),jre;jre包含jvm,原生函数库等。
2. tools.jar的作用
安装jdk时会装2套jre,一套为java工具包使用,一套为自己开发的程序使用。比如javac命令实际上是用java写的,具体在tools.jar程序中,bin目录下的javac.exe,jar.exe不过是一个包装。
java -classpath d:/j2sdk 1.4.0 /lib/tools.jar com.sun.tools.javac.Main 就是运行cmd下java命令
3. 为何安装jdk后不设置path,可以执行java,但不可以执行javac?
安装jdk后,自动在system32下复制了一个java.exe,但没有javac
4. 执行的是哪个java.exe?
(1).自己的目錄下有沒有JRE 目錄
(2).父目錄底下JRE 子目錄
(3)查詢Windows
Registry(HKEY_LOCAL_MACHINE/Software/JavaSoft/Java Runtime Environment/)。
Java.exe根据path确定,jre则根据上述规则查找,通常会有client和server2个目录下的jvm.dll
5. 如何设置path?
Path=E:/Java/jdk 1.5.0 _04/bin;%path%,指定jdk,从而找到jre;
Windows/System32下也会默认装一个java.exe,因此要特别注意
6. java –verbose class
可以查看初基本的class文件从哪个jre里load,他们是pre-load的,
而自己写的class是按需load的,节省内存
7. 真的在载入类的时候会初始化static吗?
Class. forName(String name, boolean initialize,ClassLoader loader)
默认initialize为true,但是为flase时,static只有实例化对象的时候调用一次,载入的时候不调用。
因此使用new或者forName(String name)都是默认initialize为true
getClass().getClassLoader().loadClass()效果和initialize为true一样
8. 建立自己的classLoader,Word继承Assembly
比如:例1 Office.java文件
URL u = new URL("file:/d:/my/lib/") ;
URLClassLoader ucl = new URLClassLoader(new URL[]{ u }) ;
Class c = ucl.loadClass(“Word”) ;
Assembly asm = (Assembly) c.newInstance() ;
URL u1 = new URL("file:/d:/my/lib/") ;
URLClassLoader ucl 1= new URLClassLoader(new URL[]{ u }) ;
Class c 1= ucl.loadClass(“Word”) ;
Assembly asm1 = (Assembly) c.newInstance() ;
这里有2个不同的classLoader,所以c.newInstance() 实例化了2次,如果里有静态初始化模块,这个模块会初始化2次。
Office.class由application Loader(system loader)load
URL.class , URLClassLoader.class由bootstarp loader载入(c++写的)
Word.class由URLClassLoader载入
Assembly由application loader载入
9. cmd下运行java sample发生的classloader载入分析
java—>找到jre—>找到jvm.dll—>jvm启动—>产生bootstarp classloader(c++编写的)—>载入sun.misc空间下的Launcher.java 之中的ExtClassLoader,设置其parent为null—>载入 Launcher.java 之中的AppClassLoader,设置其parent为ExtClassLoader—>AppClassLoader载入sample类
10. applicationLoader,ExtClassLoader,bootstarpClassLoader的路径
(1)applicationLoader的url是java.class.path,即classpath;
(2)ExtClassLoader的url是java.ext.dirs,即JRE 所在位置下的/lib/ext 子目录。java.ext.dirs可以在启动的时候更改,如java –Djava.ext.dirs=c:/ext;
(3)Bootstrap Loader,我们可以查询系统参数sun.boot.class.path 得知Bootstrap Loader 用来搜寻类别的系统参数。sun.boot.class.path 的內容可以在一开始下命列的时候来更改如java –D sun.boot.class.path =c:/ext,但系统参数sun.boot.class.path 则是预设的BootstrapLoader 的搜索路径同,就算您更改系统参数,也与Bootstrap Loader 完全无关
(4)更重要的是,AppClassLoader 无ExtClassLoader 在整个jvm之中只会存有一份,一旦建立了,其內部所参考的搜索路径不会改变,也就是说,即使我们在程序里利用System.setProperty()来改变系统参数的內容,仍然无法更改AppClassLoader 和ExtClassLoader 的搜索路径。因此,执行时期更改搜索路径的设置是不可能的事情。如果因为特殊需求,有些类的所在路径并非在一开始时就能决定,那么除了产生新的classloader来辅助我们载入所需的类之外,沒有其他方法了
11. classloader的委派模型
classloader有载入类的需求时,会先请示其Parent使用其搜索路径帮忙载入,如果Parent 找不到,那么才由自己依照自己的搜索路径。
App有parent ext,ext有parent bootstarp先在搜索区域查找,找不到了则ext在其搜索区域查找,ext找不到,再有app查找;如果bootstarp查找到了,则下一个也应该有bootstarp查找,如果找不到则会报错.
12. classloader委派模型的好处?
如此复杂的委派模型是为了实现安全性.
Boot,ext,app载入的类是url无法更改的,所以包装安全
13. jni的使用,在java中调用c,c++程序
14. 在c,c++中调用java程序
15. java和javac的时候用上参数-verbose,可以看到更多编译器和jvm内部的信息。
16. java和javac都可以有classpath选项,但javac –classpath c:/不需要把当前目录放进来,因为当前目录下的都能找到;
但是java –classpath c:/;.需要把当前目录指定,用于给app的classloader指定搜索路径
17. 除了jar文件之外,还可以用zip,rar文件压缩
18. xxx.jar可执行文件的执行过程—>java –jar xxx.jar—>java -cp xxx.jar mainClass(来源于manifest里的)