JVM
jvm是jre里头一个动态连接函数库,jdk里面的jre一般用于运行java本身的程序,比如javac,等等.programfiles下面的jre用于运行用户编写的java程序.
JRE下的bin\client 或者 bin\server 的jvm.dll就是JVM了
当一台机器上有多个jvm可选择的时候,jvm的选择步骤:
1)当前目录有没有jre目录(不准确),
2)父目录下的jre子目录
3)注册表HEKY_LOCAL_MACHINE\SoftWare\Java\Java Runtime Environment\
所以当运行的是jdk\bin\java.exe的时候,用的jre是bin的父目录jdk下面的jre\
运行java.exe找到了jre后有一个验证程序,验证jre和java.exe的版本是否一致,如果不一致则会发生错误
java -verbose:class Main 显示调用的详细信息
classloader的两种载入方式:1)pre-loading预先载入,载入基础类 2)load-on-demand按需求载入
只有实例化一个类才会被classloader载入,仅仅申明并不会载入
java动态载入class的两种方式:
1)implicit隐式,即利用实例化才载入的特性来动态载入class
2)explicit显式方式,又分两种方式:
1)java.lang.Class的forName()方法
2)java.lang.ClassLoader的loadClass()方法
static块在什么时候执行?
1)当调用forName(String)载入class时执行,如果调用ClassLoader.loadClass并不会执行.forName(String,false,ClassLoader)时也不会执行.
2)如果载入Class时没有执行static块则在第一次实例化时执行.比如new ,Class.newInstance()操作
3)static块仅执行一次
Class类的实例.
>>Class类无法手工实例化,当载入任意类的时候自动创建一个该类对应的Class的实例,
>>某个类的所有实例内部都有一个栏位记录着该类对应的Class的实例的位置.,
>>每个java类对应的Class实例可以当作是类在内存中的代理人.所以当要获得类的信息(如有哪些类变量,有哪些方法)时,都可以让类对应的Class的实例代劳.java的Reflection机制就大量的使用这种方法来实现
>>每个java类都是由某个classLoader(ClassLoader的实例)来载入的,因此Class类别的实例中都会有栏位记录他的ClassLoader的实例,如果该栏位为null,则表示该类别是由bootstrap loader载入的(也称root laoder),bootstrap loader不是java所写成,所以没有实例.
原生方法:forName0()等方法,native修饰符
自定义ClassLoader:
如实例化一个URLClassLoader. URLClassLoader ucl = new URLClassLoader(new URL[]{new URL("file:/e:/bin/")}),URLClassLoader优先找当前目录,再在url中找.class加载.URL中别忘在最后加"/"表示目录
各个java类由哪些classLoader加载?
1)java类可以通过实例.getClass.getClassLoader()得知
2)接口由AppClassLoader(System ClassLoader,可以由ClassLoader.getSystemClassLoader()获得实例)载入
3)ClassLoader类由bootstrap loader载入
ClassLoader hierachy:
jvm建立->初始化动作->产生第一个ClassLoader,即bootstrap loader->bootstrap loader在sum.misc.Launcher类里面的ExtClassLoader,并设定其Parent为null->bootstrap loader载入sun.misc.Launcher$AppClassLoader,并设定其parent为ExtClassLoader(但是AppClassLoader也是由bootstrap loader所载入的)->AppClassLoader载入各个xx.class,xx.class也有可能被ExtclassLoader或者bootstrap loader载入.
>>自定义的ClassLoader的.getParent()是AppClassLoader.parent和他的加载器并没有关系
>>ExtClassLoader和AppClassLoader都是URLClassLoader的子类.AppClassLoader的URL是由系统参数java.class.path取出的字符串决定,而java.class.path由 运行java.exe时 的-cp或-classpath或CLASSPATH环境变量决定
>>ExtClassLoader查找的url是系统变量java.ext.dirs,java.ext.dirs默认为jdk\jre\lib\ext
>>Bootstrap loader的查找url是sun.boot.class.path
>>在程序运行后调用System.setProperty()来改变系统变量并不能改变以上加载的路径,因为classloader读取在System.setProperty之前.sun.boot.class.path是在程序中写死的,完全不能修改
委派模型
当classloader有类需要载入时先让其parent搜寻其搜寻路径帮忙载入,如果parent找不到,在由自己搜寻自己的搜寻路径载入,ClassLoader hierachy本来就有这种性质
NoClassDefFoundError和ClassNotFoundException
NoClassDefFoundError:当java源文件已编译成.class文件,但是ClassLoader在运行期间在其搜寻路径load某个类时,没有找到.class文件则报这个错
ClassNotFoundException:试图通过一个String变量来创建一个Class类时不成功则抛出这个异常
分享到:
相关推荐
本文将深入探讨“使用classloader动态加载Class”的相关知识点,同时参考了博客链接:https://ldbjakyo.iteye.com/blog/1046984。 首先,理解ClassLoader的工作原理至关重要。Java中的类加载过程分为三个主要阶段:...
8. **ClassLoader相关基础知识**:了解类加载器的工作原理,如双亲委派模型、自定义类加载器的编写、类加载与卸载的生命周期,以及类加载过程中的链接、验证、准备、解析和初始化阶段。 9. **处理简历中的弱点**:...
下面将详细探讨这些知识点。 1. **双亲委派模型**:这是Java类加载器的基础模型,它规定了类加载的顺序。当一个类加载器收到加载类的请求时,它会首先委托父类加载器去尝试加载,只有当父类加载器无法加载时,当前...
### Java自定义类加载器(Class Loader)详解 #### 一、引言 在Java语言中,类加载...总之,理解和掌握Java类加载器的相关知识对于提高程序设计能力具有重要意义。希望本文能帮助读者更好地理解和应用Java类加载器。
1. **引导类加载器(Bootstrap ClassLoader)**:这是最基础的类加载器,负责加载Java的核心库类,如`java.lang`包下的类。 2. **扩展类加载器(Extension ClassLoader)**:它负责加载位于`-Djava.ext.dirs`系统...
### Java基础知识点详解 #### 一、Java语言的历史与地位 - **计算机语言的历史:** - **第一代语言(机器语言)**:基于0和1的二进制代码,直接与硬件交互,例如早期的打孔机。 - **第二代语言(汇编语言)**:...
对于标题“Java SE: ClassLoader in depth”和描述中提到的“源码”、“工具”,实际上在给出的内容部分并没有任何与Java ClassLoader深入相关的技术信息。所提供的内容实际上是一份公司入职报到的指南,与Java编程...
在深入探讨Java入门基础知识之前,我们首先需要澄清一些概念。Java和JavaScript虽然名字相似,但实际上它们是两种完全不同的编程语言。Java是由Sun Microsystems(现已被Oracle收购)开发的面向对象的编程语言,适用...
通过阅读和分析`icpc2013.pdf`这个文件,虽然其内容与Tomcat的ClassLoader无关,但通常这类会议论文或报告可能会涉及软件工程、编程语言或系统架构等相关领域,这些知识也能辅助我们更好地理解和改进应用程序,包括...
Java基础知识是学习Java编程的基石,对于初学者来说至关重要。以下将详细讲解这些知识点: 1. 类的修饰符: - default(默认修饰符):若无任何修饰,类仅能在同一包内的类中访问。 - public:类可被任何地方的类...
Java虚拟机(JVM)是Java程序运行的基础,它负责加载、验证、执行字节码。在JVM的运行机制中,ClassLoader起着至关重要的作用。ClassLoader负责查找并加载类到JVM中,使得程序得以运行。本篇将深入探讨ClassLoader的...
在Java编程语言中,反序列化是将之前序列化的对象数据恢复为对象的过程。了解Java反序列化的基础知识有助于深入理解...掌握这些基础知识有助于编写更安全、可扩展的代码,同时也为理解和解决相关的安全问题提供了基础。
Java 常用基础知识是程序员面试中不可或缺的部分,尤其对于准备进入阿里巴巴、腾讯、京东、百度、美团、去哪儿等互联网公司的求职者来说,掌握这些知识至关重要。以下是对这两个问题的详细解析: 1. 类加载问题:...
下面将详细讲解标题和描述中提及的一些核心Java基础知识。 1. **Java中的引用概念**:在Java中,引用是对象的一个指针,它指向内存中的对象实例。有强引用、软引用、弱引用和虚引用四种类型,分别对应不同的内存...
在Java编程语言中,ClassLoader是核心...总的来说,这些知识点涵盖了Java中的类加载机制、接口与抽象类的区别、主方法的特性、变量默认值以及类的访问控制,这些都是Java程序员在面试和实际开发中必须掌握的基础知识。
### JVM基础知识详解 #### HotSpot简介 HotSpot作为Oracle(原属SUN)的主要Java虚拟机实现,自2006年起开源,并成为OpenJDK项目的核心组成部分。它主要使用C++编写,支持多种操作系统和硬件架构。HotSpot的一个...
### Java基础知识与面试题详解 #### 基本数据类型 Java中定义了八种基本数据类型:`byte`、`short`、`int`、`long`、`boolean`、`double`、`float`、`char`。这些类型在内存中占用固定的字节数,其中`byte`类型...
Java基础知识是编程领域中至关重要的一个部分,尤其对于软件开发人员来说,理解并掌握这些基本概念是成为Java程序员的第一步。本节将深入探讨Java线程间通信、Java类加载器以及JVM内存模型这三个核心知识点。 首先...
本篇文章将深入探讨JVM的基础知识,包括它的架构、内存模型、类加载机制以及垃圾收集等核心概念。 首先,JVM的架构主要包括以下几个部分: 1. **类加载器(ClassLoader)**:负责加载类文件到JVM中。类加载器分为...
类加载器 ClassLoader 反射 Stream 流 函数式编程 Lambda 表达式 网络编程-协议 网络编程-端口 网络编程-IP 多线程 IO流-字节流 IO流-字符流 IO流-转换流 File Map HashMap 序列化和反序列化 可变参数 类型通配符 ...