文档章节

java ClassLoader小解

philonic
 philonic
发布于 2017/03/23 18:24
字数 2854
阅读 7
收藏 0

1、JVM的类加载器有三个 按顺序依次是:BoostrapClassLoader、ExtClassLoader、AppClassLoader

2、ExtClassLoader和AppClassLoader在sun.misc.Launcher类中做了定义

public class Launcher
{
    static class AppClassLoader extends URLClassLoader
    {
    code......
    }
     static class ExtClassLoader extends URLClassLoader
    {
    code......
    }
    //只给了获取BoostrapClassLoader类加载路径方法,并没有明确定义
    public static synchronized URLClassPath getBootstrapClassPath()
    {
    code......
    }
}

2、写一个测试类看看程序启动三个ClassLoader都加载了那些东西

        System.out.println("BootstrapClassLoader 的加载路径: ");
        
        URL[] urls = sun.misc.Launcher.getBootstrapClassPath().getURLs();
        for(URL url : urls)
                System.out.println(url);
        System.out.println("-------------------------------------------");
                        
        URLClassLoader extClassLoader = (URLClassLoader)ClassLoader.getSystemClassLoader().getParent();

        System.out.println(extClassLoader);
        System.out.println("ExtClassLoader 的加载路径: ");
        
        urls = extClassLoader.getURLs();
        for(URL url : urls)
                System.out.println(url);
        
        System.out.println("-------------------------------------------");
                        
        
        URLClassLoader appClassLoader = (URLClassLoader)ClassLoader.getSystemClassLoader();
        
        System.out.println(appClassLoader);
        System.out.println("AppClassLoader 的加载路径: ");
        
        urls = appClassLoader.getURLs();
        for(URL url : urls)
                System.out.println(url);
                        
        System.out.println("-------------------------------------------");

获得结果如下

BootstrapClassLoader 的加载路径: 
file:/C:/Program%20Files%20(x86)/Java/jdk1.6.0_20/jre/lib/resources.jar
file:/C:/Program%20Files%20(x86)/Java/jdk1.6.0_20/jre/lib/rt.jar
file:/C:/Program%20Files%20(x86)/Java/jdk1.6.0_20/jre/lib/jsse.jar
file:/C:/Program%20Files%20(x86)/Java/jdk1.6.0_20/jre/lib/jce.jar
file:/C:/Program%20Files%20(x86)/Java/jdk1.6.0_20/jre/lib/charsets.jar
file:/C:/Program%20Files%20(x86)/Java/jdk1.6.0_20/lib/dt.jar
file:/C:/Program%20Files%20(x86)/Java/jdk1.6.0_20/lib/tools.jar
file:/C:/Program%20Files%20(x86)/Java/jdk1.6.0_20/jre/lib/plugin.jar
-------------------------------------------
sun.misc.Launcher$ExtClassLoader@3e25a5
扩展类加载器 的加载路径: 
file:/C:/Program%20Files%20(x86)/Java/jdk1.6.0_20/jre/lib/ext/dnsns.jar
file:/C:/Program%20Files%20(x86)/Java/jdk1.6.0_20/jre/lib/ext/localedata.jar
file:/C:/Program%20Files%20(x86)/Java/jdk1.6.0_20/jre/lib/ext/sunjce_provider.jar
file:/C:/Program%20Files%20(x86)/Java/jdk1.6.0_20/jre/lib/ext/sunmscapi.jar
file:/C:/Program%20Files%20(x86)/Java/jdk1.6.0_20/jre/lib/ext/sunpkcs11.jar
-------------------------------------------
sun.misc.Launcher$AppClassLoader@1a46e30
应用(系统)类加载器 的加载路径: 
file:/D:/work/workspace_pafa4/dbOperator/bin/
file:/D:/work/workspace_pafa4/dbOperator/src/lib/ojdbc14.jar
file:/D:/work/workspace_pafa4/dbOperator/src/lib/postgresql-9.4-1201.jdbc4.jar
file:/D:/work/workspace_pafa4/dbOperator/src/lib/commons-logging-1.0.4.jar
file:/D:/work/workspace_pafa4/dbOperator/src/lib/log4j-1.2.15.jar
file:/D:/work/workspace_pafa4/dbOperator/src/lib/poi-3.9.jar
file:/D:/work/workspace_pafa4/dbOperator/src/lib/commons-beanutils.jar
file:/D:/work/workspace_pafa4/dbOperator/src/lib/commons-collections-3.1.jar
file:/D:/work/workspace_pafa4/dbOperator/src/lib/commons-lang-2.2.jar
file:/D:/work/workspace_pafa4/dbOperator/src/lib/barcode4j.jar

看结果应该很清楚吧。 BootstrapClassLoader ---系统根加载器 ExtClassLoader ---加载JVM扩展所需的类 AppClassLoader ---加载应用(项目)的类和所需的类(在Eclipse上看到的Referenced Libraries)

BootstrapClassLoader加载了rt.jar、dt.jar和tools.jar,做什么用的呢?简单介绍一下

dt.jar和tools.jar位于:{Java_Home}/lib/下,而rt.jar位于:{Java_Home}/jre/lib/下,其中: rt.jar是JAVA基础类库,也就是你在java doc里面看到的所有的类的class文件 dt.jar是关于运行环境的类库 tools.jar是工具类库,编译和运行需要的都是toos.jar里面的类分别是sun.tools.java.; sun.tols.javac.; 在Classpath设置这几个变量,是为了方便在程序中 import;Web系统都用到tool.jar。 rt.jar rt.jar 默认就在Root Classloader的加载路径里面的,而在Claspath配置该变量是不需要的;同时jre/lib目录下的 其他jar:jce.jar、jsse.jar、charsets.jar、resources.jar都在Root Classloader中 tools.jar tools.jar 是系统用来编译一个类的时候用到的,即执行javac的时候用到 javac XXX.java 实际上就是运行 java -Calsspath=%JAVA_HOME%\lib\tools.jar xx.xxx.Main XXX.java javac就是对上面命令的封装 所以tools.jar 也不用加到classpath里面 dt.jar dt.jar是关于运行环境的类库,主要是swing的包 在用到swing时最好加上

扩展说一下JDK里面的一些jar的作用吧。

C:\Program Files\Java\jdk1.7.0_21 -- JDK的根目录,包含一些软件版权,声明,和自述文件,同时包含归档了的Java平台源代码包src.zip      

C:\Program Files\Java\jdk1.7.0_21\src.zip -- 归档的Java源代码 

C:\Program Files\Java\jdk1.7.0_21\include -- C 语言头文件 支持 用Java本地接口和Java虚拟机接口 来本机代码编程

C:\Program Files\Java\jdk1.7.0_21\lib  -- Java开发工具要用的一些库文件,有包含了支持JDK工具的非核心类库tool.jar,dt.jar 归档的 BeanInfo 文件,用于告诉IDE这样显示java组件怎样让开发者在自己的应用程序中用户化它们 

================C:\Program Files\Java\jdk1.7.0_21\jre================

C:\Program Files\Java\jdk1.7.0_21\jre  -- JDK使用的Java运行环境(JRE)的根目录,这个运行环境实现了Java平台          

C:\Program Files\Java\jdk1.7.0_21\jre\bin -- Java平台所要用的工具和库的可执行文件这些可执行文件和 /jdk1.7.0_21/bin相同的。这个路径不需要设置 PATH 环境变量  //Java 启动器工具充当了应用程序启动器(覆盖了1.1版本的JDK推出的旧版本JRE工具)

C:\Program Files\Java\jdk1.7.0_21\jre\bin\client  -- 包含Java Hotspot(Java性能引擎) Client Virtual Machine 客户虚拟机要用的DLL文件 

C:\Program Files\Java\jdk1.7.0_21\jre\bin\server -- 包含Java Hotspot(Java性能引擎) Server Virtual Machine 服务器虚拟机要用的DLL文件 ----JDK 比 JRE C:\Program Files\Java\jre7\bin多一个server端的java虚拟机。即这个folder “Server” 不存在于JRE下。

C:\Program Files\Java\jdk1.7.0_21\jre\lib -- JRE要用的代码库,属性设置,资源文件。 

C:\Program Files\Java\jdk1.7.0_21\jre\lib\rt.jar -- Java 引导类库(java 核心APIRunTime类) 

C:\Program Files\Java\jdk1.7.0_21\jre\lib\charsets.jar -- 字符转换类库 

C:\Program Files\Java\jdk1.7.0_21\jre\lib\ext -- 默认的Java平台扩展安装环境 

C:\Program Files\Java\jdk1.7.0_21\jre\lib\ext\localedata.jar --  ava.text 和 java.util包要用到的地区数据  

C:\Program Files\Java\jdk1.7.0_21\jre\lib\security -- 包含安全管理文件,有安全规则(java.policy)和安全属性文件(java.security) 

C:\Program Files\Java\jdk1.7.0_21\jre\lib\applet -- Java applets 要的Jar包,可以放到lib/applet/目录,可以节省 applet 类装载器从本地文件系统装载 大的applets 所需的applet类时间,减少从网上下载具有相同的保护的时间。 

C:\Program Files\Java\jdk1.7.0_21\jre\lib\fonts -- 包含平台所需的TrueType字体文件 

================C:\Program Files\Java\jdk1.7.0_21\db================

C:\Program Files\Java\jdk1.7.0_21\db  -- db目录,纯Java开发的数据库 Apache Derby,是一个开源的100%Java开发的关系数据库 

        [有关 Java DB 的信息](http://developers.sun.com/prodtech/javadb/)

        [有关 Derby 的文档](http://db.apache.org/derby/manuals/index.html)

================C:\Program Files\Java\jdk1.7.0_21\bin================

C:\Program Files\Java\jdk1.7.0_21\bin -- JDK包含的一些开发工具执行文件 

C:\Program Files\Java\jdk1.7.0_21\bin\javac.exe -- 基本工具 - Java语言编译器, 将Java源代码转换成字节码

C:\Program Files\Java\jdk1.7.0_21\bin\java.exe --  基本工具 - Java应用程序启动器,直接从类文件执行Java应用程序字节代码

C:\Program Files\Java\jdk1.7.0_21\bin\javadoc.exe --  基本工具 - Java API 文档生成器,从源码注释中提取文档

C:\Program Files\Java\jdk1.7.0_21\bin\apt.exe --  基本工具 - java 注释处理器 

C:\Program Files\Java\jdk1.7.0_21\bin\appletviewer.exe --  基本工具 - java applet 小程序浏览器,一种执行HTML文件上的Java小程序的Java浏览器。

C:\Program Files\Java\jdk1.7.0_21\bin\jar.exe --  基本工具 - java文件压缩打包工具 

C:\Program Files\Java\jdk1.7.0_21\bin\jdb.exe --  基本工具 - Java 调试器,debugger,查错工具

C:\Program Files\Java\jdk1.7.0_21\bin\javah.exe --  基本工具 - C 头文件和stub生成器,用于写本地化方法,例如生产JNI样式的头文件。产生可以调用Java过程的C过程,或建立能被Java程序调用的C过程的头文件

C:\Program Files\Java\jdk1.7.0_21\bin\javap.exe --  基本工具 - class文件反编译工具,显示编译类文件中的可访问功能和数据,同时显示字节代码含义。

C:\Program Files\Java\jdk1.7.0_21\bin\extcheck.exe --  基本工具 - 用于检测jar包中的问题 

C:\Program Files\Java\jdk1.7.0_21\bin\keytool.exe -- 安全工具 - 管理密钥库和证书. 

C:\Program Files\Java\jdk1.7.0_21\bin\jarsigner.exe -- 安全工具 - 生产和校验JAR签名 

C:\Program Files\Java\jdk1.7.0_21\bin\policytool.exe -- 安全工具 - 有用户界面的规则管理工具   

C:\Program Files\Java\jdk1.7.0_21\bin\kinit.exe.exe -- 安全工具 - 用于获得和缓存网络认证协议Kerberos 票证的授予票证 

C:\Program Files\Java\jdk1.7.0_21\bin\klist.exe.exe -- 安全工具 - 凭据高速缓存和密钥表中的 Kerberos 显示条目  

C:\Program Files\Java\jdk1.7.0_21\bin\ktab.exe.exe -- 安全工具 - 密钥和证书管理工具  

C:\Program Files\Java\jdk1.7.0_21\bin\native2ascii.exe -- Java国际化工具 - 将文本转化为 Unicode Latin-1。[详情参考](http://java.sun.com/javase/6/docs/technotes/tools/windows/native2ascii.html)

C:\Program Files\Java\jdk1.7.0_21\bin\rmic.exe -- 远程方法调用工具 - 生成远程对象的stubs and skeletons(存根和框架) 

C:\Program Files\Java\jdk1.7.0_21\bin\rmid.exe -- 远程方法调用工具 - Java 远程方法调用(RMI:Remote Method Invocation) 活化系统守护进程 

C:\Program Files\Java\jdk1.7.0_21\bin\rmiregistry.exe -- 远程方法调用工具 - Java 远程对象注册表 

C:\Program Files\Java\jdk1.7.0_21\bin\serialver.exe -- 远程方法调用工具 - 返回类的 serialVersionUID.

C:\Program Files\Java\jdk1.7.0_21\bin\tnameserv.exe -- Java IDL and RMI-IIOP 工具 - Provides access to the naming service.  

C:\Program Files\Java\jdk1.7.0_21\bin\idlj.exe -- Java IDL and RMI-IIOP 工具 - 生产映射到OMG IDL接口可以使Java应用程序使用CORBA的.java文件 

C:\Program Files\Java\jdk1.7.0_21\bin\orbd.exe -- Java IDL and RMI-IIOP 工具 - 为客户可以在CORBA环境下透明的定位和调用服务器的稳定的对象提供支持 

C:\Program Files\Java\jdk1.7.0_21\bin\servertool.exe -- Java IDL and RMI-IIOP 工具 - 为应用程序提供易于使用的接口用于注册,注销,启动,关闭服务器 

C:\Program Files\Java\jdk1.7.0_21\bin\pack200.exe -- Java 部署工具 - 使用java gzip压缩工具将JAR文件转换为压缩的pack200文件,生产打包文件是高度压缩的JAR包,可以直接部署,减少下载时间 

C:\Program Files\Java\jdk1.7.0_21\bin\unpack200.exe -- Java 部署工具 - 解包pack200文件为JARs  

C:\Program Files\Java\jdk1.7.0_21\bin\htmlconverter.exe -- Java 插件工具 - Java Plug-in HTML转换器 htmlconverter -gui 可以启动图形界面 

C:\Program Files\Java\jdk1.7.0_21\bin\javaws.exe -- Java web 启动工具 - Java web 启动命令行工具 

C:\Program Files\Java\jdk1.7.0_21\bin\jvisualvm.exe -- Java 故障检修,程序概要分析,监视和管理工具 - 一个图形化的Java虚拟机,不说了 大家研究一下就发现太酷了.这是想了解JVM的人的神器
[参考](http://java.sun.com/javase/6/docs/technotes/guides/visualvm/index.html)

C:\Program Files\Java\jdk1.7.0_21\bin\jconsole.exe -- Java 故障检修,程序概要分析,监视和管理工具 -java监视台和管理控制台,图形界面的功能太强大了,运行一下就知道 ,不想多说,看了就知道 

C:\Program Files\Java\jdk1.7.0_21\bin\schemagen.exe  -- Java web 服务工具 - Java构架的XML Schema生成器 

C:\Program Files\Java\jdk1.7.0_21\bin\wsgen.exe  -- Java web 服务工具 - 生成 JAX-WS 

C:\Program Files\Java\jdk1.7.0_21\bin\wsimport.exe -- Java web 服务工具 - 生成 JAX-WS 

C:\Program Files\Java\jdk1.7.0_21\bin\xjc.exe -- Java web 服务工具 - 绑定编译器  

C:\Program Files\Java\jdk1.7.0_21\bin\jps.exe -- 监视工具 - JVM Process Status 进程状态工具。列出目标系统的HotSpot JJVM , 监视Java虚拟机的性能,不支持Windows 98 和Windows ME 平台 

C:\Program Files\Java\jdk1.7.0_21\bin\jstat.exe -- 监视工具 - 按照命令行的具体要求记录和收集一个JVM的性能数据 

C:\Program Files\Java\jdk1.7.0_21\bin\jstatd.exe -- 监视工具 - JVM jstat 的守护进程 

C:\Program Files\Java\jdk1.7.0_21\bin\jinfo.exe -- 故障检测和修理工具 - 配置或打印某个Java进程VM flag 

C:\Program Files\Java\jdk1.7.0_21\bin\jhat.exe -- 故障检测和修理工具 - 堆储存查看器 

C:\Program Files\Java\jdk1.7.0_21\bin\jmap.exe  -- 故障检测和修理工具 - Java内存图 

C:\Program Files\Java\jdk1.7.0_21\bin\jsadebugd.exe -- 故障检测和修理工具 - Java 的 Serviceability Agent Debug的守护进程 

C:\Program Files\Java\jdk1.7.0_21\bin\jstack.exe -- 故障检测和修理工具 - Java堆栈跟踪 

C:\Program Files\Java\jdk1.7.0_21\bin\jrunscript.exe -- Java脚本工具 - 运行脚本 

© 著作权归作者所有

上一篇: oracle package
下一篇: 业余爱好
philonic

philonic

粉丝 4
博文 34
码字总数 71311
作品 0
后端工程师
私信 提问
浅谈java classloader

本文由作者张远道授权网易云社区发布。 类加载器三杰 jvm有三类classloader,分别是bootstrap classloader,extended classloader以及system classloader。 bootstrap classloader是系统在启动...

网易云
2018/12/14
0
0
深入分析Java ClassLoader原理

一、什么是ClassLoader? 大家都知道,当我们写好一个Java程序之后,不是管是CS还是BS应用,都是由若干个.class文件组织而成的一个完整的Java应用程序,当程序在运行时,即会调用该程序的一个...

5W1H-
2013/05/27
0
2
ClassLoader加载Class的过程 解析

ClassLoader即类加载器,负责将 .class 文件(可能在磁盘上, 也可能在网络上) 加载到内存中, 并为之生成对应的 java.lang.Class 对象,当 JVM 启动时,会形成由三个类加载器组成的初始类加载器...

phacks
2015/08/19
0
0
eclipse下java动态编译时com.sun.tools.javac.Main类加载问题的解决

java.lang.NoClassDefFoundError: com/sun/tools/javac/Main 最近在使用java的动态编译的时候出现的问题,主要是由于在使用类com.sun.tool.javac.Main时,总是出现NoClassDefFoundError的错误,...

Jonee_Leo
2012/06/16
0
0
Java Classloader机制解析

做Java开发,对于ClassLoader的机制是必须要熟悉的基础知识,本文针对Java ClassLoader的机制做一个简要的总结。因为不同的JVM的实现不同,本文所描述的内容均只限于Hotspot Jvm. 本文将会从...

aminqiao
2014/05/09
0
2

没有更多内容

加载失败,请刷新页面

加载更多

(一)java版电子商务spring cloud分布式微服务b2b2c社交电商-服务的注册与发现(Eureka)

一、spring cloud简介 spring cloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等。它运行环...

itcode-code
27分钟前
1
0
tomcat 监控工具psi-probe

tomcat 监控工具psi-probe

wangxujun59
28分钟前
1
0
JAVA.NET.SOCKETEXCEPTION: TOO MANY OPEN FILES

最近随着网站访问量的提高把web服务器移到linux下了,在移服务器的第二天,tomcat频繁的报 java.net.SocketException: Too many open files错误,错误日志达到了100多兆,郁闷了,windows上运...

BryceLoski
30分钟前
1
0
springboot+jpa 实现分页

分页实体 import java.util.ArrayList;import java.util.List;/** * 分页工具 */public class PageUtil { /** * 每页大小 */ private int pageSize...

冥焱
30分钟前
2
0
第四讲:搭建后台界面

前面完成了登录界面及验证码,下面讲登录完后的事情。 登录成功后,页面进行跳转,跳转到后台管理界面。 1、后台管理界面的布局如下: 如下: 2、新建Admin控制器,并且在控制器里面新建几个...

一匹狼工作室
32分钟前
15
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部