java深度历险读书笔记

1.  jdk,jre,jvm关系

jdk包含java开发工具包(java.exe等),jrejre包含jvm,原生函数库等。

2.  tools.jar的作用

安装jdk时会装2jre,一套为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  就是运行cmdjava命令

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则根据上述规则查找,通常会有clientserver2个目录下的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文件从哪个jreload,他们是pre-load的,

而自己写的class是按需load的,节省内存

7.  真的在载入类的时候会初始化static吗?

Class. forName(String name, boolean initialize,ClassLoader loader)

默认initializetrue,但是为flase时,static只有实例化对象的时候调用一次,载入的时候不调用。

因此使用new或者forNameString name)都是默认initializetrue

getClass().getClassLoader().loadClass()效果和initializetrue一样

 

8.  建立自己的classLoaderWord继承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.classapplication Loadersystem loaderload

URL.class , URLClassLoader.classbootstarp loader载入(c++写的)

Word.classURLClassLoader载入

Assemblyapplication loader载入

 

9.  cmd下运行java sample发生的classloader载入分析

java—>找到jre>找到jvm.dll>jvm启动—>产生bootstarp classloaderc++编写的)—>载入sun.misc空间下的Launcher.java 之中的ExtClassLoader,设置其parentnull>载入 Launcher.java 之中的AppClassLoader,设置其parentExtClassLoader>AppClassLoader载入sample

 

10.             applicationLoaderExtClassLoaderbootstarpClassLoader的路径

1applicationLoaderurljava.class.path,即classpath

2ExtClassLoaderurljava.ext.dirs,即JRE 所在位置下的/lib/ext 子目录。java.ext.dirs可以在启动的时候更改,如java –Djava.ext.dirs=c:/ext;

3Bootstrap 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 找不到,那么才由自己依照自己的搜索路径。

Appparent extextparent bootstarp先在搜索区域查找,找不到了则ext在其搜索区域查找,ext找不到,再有app查找;如果bootstarp查找到了,则下一个也应该有bootstarp查找,如果找不到则会报错.

 

12.             classloader委派模型的好处?

如此复杂的委派模型是为了实现安全性.

Bootextapp载入的类是url无法更改的,所以包装安全

 

13.             jni的使用,在java中调用cc++程序

14.             cc++中调用java程序

 

 

15.             javajavac的时候用上参数-verbose,可以看到更多编译器和jvm内部的信息。

16.             javajavac都可以有classpath选项,但javac –classpath c:/不需要把当前目录放进来,因为当前目录下的都能找到;

但是java –classpath c:/.需要把当前目录指定,用于给appclassloader指定搜索路径

17.             除了jar文件之外,还可以用ziprar文件压缩

18.             xxx.jar可执行文件的执行过程—>java –jar xxx.jar>java -cp xxx.jar mainClass(来源于manifest里的)

 

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值