Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1276892
  • 博文数量: 185
  • 博客积分: 50
  • 博客等级: 民兵
  • 技术积分: 3934
  • 用 户 组: 普通用户
  • 注册时间: 2007-09-11 13:11
个人简介

iihero@ChinaUnix, ehero.[iihero] 数据库技术的痴迷爱好者. 您可以通过iihero AT qq.com联系到我 以下是我的三本图书: Sybase ASE in Action, Oracle Spatial及OCI高级编程, Java2网络协议内幕

文章分类

全部博文(185)

文章存档

2014年(4)

2013年(181)

分类: Java

2013-07-22 14:26:31

关于Java性能方面的东西,涉及挺多。一直想写个总结。

第一部分,还是介绍class loader(类加载器,译文不如原文流畅了,估计用英文原词吧),它主要用于在Java虚拟机运行时加载所需要的类。

 

一、这些类,有两部分:一部分是你的应用程序中的java类,另一部分是Java API中的类文件。加载器有两个重要的工作:

 

1. loading: 找到一个类, 并导入它的二进制数据表示

2. linking: 执行验证,准备,以及可能的解析工作

       验证:确保导入的类型是正确的

       准备:为类变量准备足够内存,并为相应的变量执行初始化操作

       解析:从符号引用变为直接引用,同时加载该类所引用的所有类

 

二、JVM中缺省的class loader:

1. $JAVA_HOME/jre/lib/rt.jar被Bootstrap Class loader加载:

    注意看到:sun/misc/Launcher$ExtClass, sun/misc/Launcher$AppClass这两个class

    它是所有Class Loader的root class loader

2. Extention class loader:

    来源于$JAVA_HOME/jre/lib/ext/*.jar

3. System Class Loader,这一级,就到了用户定义的$CLASSPATH中的class的加载了

    用户定义的classloader都是System class loader的子class loader.

 

三、类加载顺序:

1. 首先从已经加载的cache中查找,如果加载过,则返回

2. 从父classloader中加载(递归查找), 这确保API中的class都是被BootStrap class loader加载

3. 如果2中找不到,则使用当前的classloader进行加载

这也可以看出,一个class loader只能看到它的祖先class loader和它自身加载的类。看不到子class loader加载的类。

    System Class Loader可以通过 cl.getSystemClassLoader()得到。

 

四、指定系统classloader的参数:

Boot Class Path (Bootstrap CL)
-Xbootclasspath:
-Xbootclasspath:/a  (append to the end)
-Xbootclasspath:/p  (prepend to the front)

Extention Class Path (Extention CL)
-Djava.ext.dirs=
System Class Path (System CL)
-cp or -classpath
-Djava.class.path=

 

五、显式加载和隐式加载

1. 显式方式:

    cl.loadClass()  (cl是java.lang.ClassLoader的一个实例)

    Class.forName() (当前classloader是起始classloader)

 

2. 隐式方式:

    当被当成引用,类进行实例化,以及产生继承关系时,JVM将进行必要的解析并加载该类

 

    因此,classloader显式的加载一个类,并隐式的加载所有其引用类

 

六、ClassLoader的跟踪信息:

java -verbose:class  (class loading)
java -verbose:gc (gc output)
java -verbose:jni (jni output)

 

七、ClassLoader中的path

URLClassLoader l = new URLClassLoader(new URL[] { new URL(     "file://D:/eclipse3.1/workspace/testclass/")});
URLClassLoader l = new URLClassLoader(new URL[] { new URL(     "file://D:/eclipse3.1/workspace/testclass")});
以'/'结束,表示目录路径,可加载下边所有的class; 如果不是以'/'结束,则意味着它是一个jar或zip文件。

 

子类的父类的classloader必须是子类的classloader或祖先classloader。不同的classloader加载的同名class不能相互cast。

 

获取JVM当前线程栈信息:

Windows:
Ctrl + Break

Unix/Linux:
Ctrl + /
kill –QUIT
kill –SIGQUIT

 


参考资料:

Inside the Java Virtual Machine
Demystifying class loading problems
http://www-128.ibm.com/developerworks/java/library/j-dclp1/index.html
Java Platform Performance: Strategies and Tactics


阅读(2845) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~