类加载器将字节码文件加载到内存中,同时在方法区中生成对应的java.land.class对象  作为外部访问方法区的入口. 类加载器的层次结构: 引导类加载器<-------------扩展类加载器<--------------------------引用程序类加载器<-----------------自定义类加载器 1.引导类加载器加载jre/lib/rt.jar包下加载核心类库 2.扩展类加载器 负责加载jre/lib/ext/*.jar 3.引用程序类加载器  加载我们自定义类 4…
Java类加载器采用双亲委派模型: 1.启动类加载器:这个类加载器负责放在<JAVA_HOME>\lib目录中的,或者被-Xbootclasspath参数所指定的路径中的,并且是虚拟机识别的类库.用户无法直接使用. 2.扩展类加载器:这个类加载器由sun.misc.Launcher$AppClassLoader实现.它负责<JAVA_HOME>\lib\ext目录中的,或者被java.ext.dirs系统变量所指定的路径中的所有类库.用户可以直接使用. 3.应用程序类加载器:这个类…
一.类加载器结构 1.引导类加载器(bootstrap class loader) 它用来加载Java的核心库(JAVA_HOME/jre/lib/rt.jar),是用原声代码来实现的,并不继承自java.lang.Classloader. 加载扩展类和应用程序类加载器.并制定指定的父类加载器. 2.扩展类加载器(extensions class loader) 用来加载Java的扩展库(JAVA_HOME/JRE/EXT/*.jar),Java虚拟机的实现会提供一个扩展库目录.该加载器在此目录…
前言:最近两个月公司实行了996上班制,加上了熬了两个通宵上线,状态很不好,头疼.牙疼,一直没有时间和精力写博客,也害怕在这样的状态下写出来的东西出错.为了不让自己荒废学习的劲头和习惯,今天周日,也打算写一篇博客,就算是为了给自己以前立的flag(每个月必须写几篇博客)的实现.那么本次博客的主题我选择了java的类加载过程的探究以及双亲委派机制模型以及它被破坏的场景,搞清楚这个对于我们理解java的类加载过程以及面试中都是很有必要的. 本篇博客的目录 一:类加载器 二:类加载的过程和阶段 三:双…
java是一种类型安全的语言,它有四类称为安全沙箱机制的安全机制来保证语言的安全性,这四类安全沙箱分别是: 类加载体系 .class文件检验器 内置于Java虚拟机(及语言)的安全特性 安全管理器及Java API 本篇博客主要介绍“类加载体系”的基本原理:如需了解其它几类安全机制可以通过上面的博客链接进入查看. 简介 “类加载体系”及ClassLoader双亲委派机制.java程序中的 .java文件编译完会生成 .class文件,而 .class文件就是通过被称为类加载器的ClassLoad…
引子:       类加载器(classloader)是独立于虚拟机之外,可以独立实现的代码模块.     OSGi使用了类加载器的这一特点实现其热插拔的特性       Java同C++等语言不通,其连接操作不是在编译期间进行的,而是在程序运行期间进行的,这也就为java的动态扩展的语言特性提供了基础.   首先介绍下虚拟机的类加载机制:     类加载的时机:           类被从加载到虚拟机内存开始,到卸出内存为止,整个生命周期包括了以下七个过程:           加载 - 验证…
虚拟机设计团队把类加载阶段张的”通过一个类的全限定名来获取此类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类.实现这个动作的代码模块称为”类加载器”.类加载器虽然只用于实现类的加载动作,但它在Java程序中起到的作用却远远不限定于类加载阶段.对于任意一个类,都需要由加载它的类加载器和这个类本身一同确立其在Java虚拟机中的唯一性,每一个类加载器,都拥有一个独立的类名称空间.这句话表达地再简单一点就是:比较两个类是否”相等”,只有在这两个类是由同一…
在了解双亲委派机制之前,你应当知道classloader(如果不了解,可以现在去恶补一下哈) 四种classloader 虚拟机自带 引导类加载器(Bootstrap ClassLoader) 扩展类加载器(Extension ClassLoader) 系统类加载器(Application ClassLoader) 用户自定义 用户自定义类加载器,需要继java.lang.ClassLoader package java.lang; public abstract class ClassLoad…
前言 前文已经讲了虚拟机将java文件编译成class文件后的格式:JVM虚拟机Class类文件研究分析 java文件经过编译,形成class文件,那么虚拟机如何将这些Class文件读取到内存中呢? 加载的时机 JVM 会在程序第一次主动引用类的时候加载该类,被动引用时并不会引发类加载的操作.也就是说,JVM 并不是在一开始就把一个程序就所有的类都加载到内存中,而是到不得不用的时候才把它加载进来,而且只加载一次. 一个类的生命周期如图所示: 上图中的加载.验证.准备.初始化.卸载这几个步骤是相对…
JVM探究 请你谈谈你对JVM的理解?java8虚拟机和之前的变化gengxin? 什么是OOM,什么是栈溢出StackOverFlowError JVM的常用调优参数有哪些? 内存快转如何抓取,怎么分析Dump文件?知道吗? 谈谈你对JVM中类加载器的认识? 1.JVM的位置 2.JVM的体系结构 栈里面肯定不会有垃圾,用完就弹出来了. 堆里面会有垃圾 JVM调优99%都是调方法区和堆 3.类的加载器 作用:加载class文件~ new Student(); package com.qingk…
所谓的类加载器(Class Loader)就是加载Java类到Java虚拟机中的,前面<面试官,不要再问我"Java虚拟机类加载机制"了>中已经介绍了具体加载class文件的机制.本篇文章我们重点介绍加载器和双亲委派机制. 类加载器 在JVM中有三类ClassLoader构成:启动类(或根类)加载器(Bootstrap ClassLoader).扩展类加载器(ExtClassLoader).应用类加载器(AppClassLoader).不同的类加载器负责不同区域的类的加载.…
前言 之前详细介绍了Java类的整个加载过程(类加载机制详解).虽然,篇幅较长,但是也不要被内容吓到了,其实每个阶段都可以用一句话来概括. 1)加载:查找并加载类的二进制字节流数据. 2)验证:保证被加载的类的正确性. 3)准备:为类的静态变量分配内存,并设置默认初始值. 4)解析:把类中的符号引用转换为直接引用. 5)初始化:为类的静态变量赋予正确的初始值. 当然,要想掌握类加载机制,还是需要去深入研究的.(好吧,说了一句正确的废话)因为其中,有很多知识点也是面试中常问的.比如,我之前去面试的…
一.JAVA类加载器包括几种? 启动类加载器 bootstrap class loader 启动类加载器主要加载的是JVM自身需要的类,这个类加载是用C++语言实现的,是虚拟机自身的一部分,它负责将 /lib路径下的核心类库或-Xbootclasspath参数指定的路径下的jar包加载到内存中,注意:由于虚拟机是按照文件名识别加载jar包的,如rt.jar,如果文件名不被虚拟机识别,即使把jar包丢到lib目录下也是没有作用的(出于安全考虑,Bootstrap启动类加载器只加载包名为java.j…
一.概述   定义:虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的java类型.类加载和连接的过程都是在运行期间完成的. 二. 类的加载方式   1):本地编译好的class中直接加载 2):网络加载:java.net.URLClassLoader可以加载url指定的类 3):从jar.zip等等压缩文件加载类,自动解析jar文件找到class文件去加载util类 4):从java源代码文件动态编译成为class文件   三.类…
预定义类加载器和双亲委派机制 JVM预定义的三种类型类加载器: 启动(Bootstrap)类加载器:是用本地代码实现的类装入器,它负责将 <Java_Runtime_Home>/lib下面的类库加载到内存中(比如rt.jar).由于引导类加载器涉及到虚拟机本地实现细节,开发者无法直接获取到启动类加载器的引用,所以不允许直接通过引用进行操作. 标准扩展(Extension)类加载器:是由 Sun 的 ExtClassLoader(sun.misc.Launcher$ExtClassLoader)…
  Launcher启动类 本文是双亲委派机制的源码分析部分,类加载机制中的双亲委派模型对于jvm的稳定运行是非常重要的 不过源码其实比较简单,接下来简单介绍一下   我们先从启动类说起 有一个Launcher类   sun.misc.Launcher;   仔细看下这简短的几行注释,可以得到有用的信息 ps:直接IDE里面查看反编译的,看不到注释的,可以下载openJDK查看源码,我的这个版本是openjdk-8-src-b132-03_mar_2014   sun.misc.Launcher…
1.类的加载.连接和初始化 当程序使用某个类时,如果该类还未被加载到内存中,则系统会通过加载.连接.初始化三个步骤来对类进行初始化.如果没有意外,jvm将会连续完成这三个步骤,有时也把这三个步骤统称为类的加载和初始化 1.1 类的加载 类加载器根据类的全名以二进制流的形式读取class文件到JVM内存的方法区中,然后转换为一个与目标类对应的java.lang.Class对象实例. 1.2 类的连接 链接阶段要做的是将加载到JVM中的二进制字节流的类数据信息合并到JVM的运行时状态中,经由验证.准…
JVM 的生命周期 虚拟机的启动 Java 虚拟机的启动是通过引导类加载器(bootstrap class loader)创建一个初始类(initial class)来完成的,这个类是由虚拟机的具体实现指定的. 虚拟机的执行 一个运行中的 Java 虚拟机有着一个清晰的任务:执行 Java 程序. 程序开始执行时他才运行,程序结束时他就停止. 执行一个所谓的 Java 程序的时候,真真正正在执行的是一个叫做 Java 虚拟机的进程. 虚拟机的退出 有如下的几种情况: 程序正常执行结束 程序在执行…
<深入理解java虚拟机>——Tomcat类加载器体系结构 标签: java / 虚拟机 / tomcat Tomcat 等主流Web服务器为了实现下面的基本功能,都实现了不止一个自定义的类加载器: (1).部署在同一个服务器上的两个web应用程序所使用的Java类库可以相互隔离. (2).部署在同一个服务器上的两个web应用程序所使用的java类库可以相互共享. (3).许多Web服务器本身使用java语言实现,因此服务器所使用的类库应与应用程序的类库相互独立. (4).支持JSP应用的We…
类加载器 jvm 和 类的关系 当调用 java命令运行一个java程序时,会启动一个java虚拟机进程.同一个jvm的所有线程.所有变量都处于同一个进程里,都使用该jvm进程的内存区. jvm进程终止的情况: 1.程序运行到最后正常结束. 2.遇到System.exit()或Runtime.getRuntime.exit(). 3.遇到未捕获的异常或错误 4.程序所在的平台强制结束了JVM进程 jvm进程终止,jvm内存中的数据将全部丢失. 类加载 当程序主动使用某个类时,如果该类还未被加载到…
前面我们知道类加载有系统自带的3种加载器,也有自定义的加载器,那么这些加载器之间的关系是什么,已经在加载类的时候,谁去加载呢?这节,我们将进行讲解. 一.双亲委派机制 JVM的ClassLoader采用的是树形结构,除了BootstrapClassLoader以外?每个ClassLoader都会有一个parentClassLoader,用户自定义的ClassLoader默认的parentClassLoader是SystemClassLoader,当然你可以自己指定需要用哪一个ClassLoade…
Java 类加载体系之 ClassLoader 双亲委托机制 java 是一种类型安全的语言,它有四类称为安全沙箱机制的安全机制来保证语言的安全性,这四类安全沙箱分别是: 类加载体系 .class文件检验器 内置于java虚拟机的安全特性 安全管理器及javaAPI 类的加载体系如下 java 程序中的 .java 文件编译完会生成 .class 文件,而 .class 文件就是通过被称为类加载器的 ClassLoader加载的,而 ClassLoder 在加载过程中会使用"双亲委派机制&quo…
jar 运行过程和类加载机制有关,而类加载机制又和我们自定义的类加载器有关,现在我们先来了解一下双亲委派模式. java 中类加载器分为三个: BootstrapClassLoader 负责加载 ${JAVA_HOME}/jre/lib 部分 jar 包 ExtClassLoader 加载 ${JAVA_HOME}/jre/lib/ext 下面的 jar 包 AppClassLoader 加载用户自定义 -classpath 或者 Jar 包的 Class-Path 定义的第三方包 类的生命周期…
2. 双亲委派机制 2.1 双亲委派机制工作原理 2.1.1 原理 Java虚拟机对class文件采用的是按需加载的方式,也就是说当需要使用该类时才会将它的class文件加载到内存,生成class对象. 加载某个类的class文件时,Java虚拟机采用的是双亲委派模式,即把请求交由父类处理,它是一种任务委派模式. 2.1.2 举例说明 自定义一个java.lang.String,然后在另外的类中调用String类,会发现只打印了"hello",没有打印"我是自定义加载类&qu…
@ 目录 前言 类的生命周期 加载 验证 准备 解析 初始化 案例一 案例二 案例三 案例四 类加载器 类加载器和双亲委派模型 破坏双亲委派模型 第一次 SPI Tomcat OSGI 总结 前言 前面学习了虚拟机的内存结构.对象的分配和创建,但对象所对应的类是怎么加载到虚拟机中来的呢?加载过程中需要做些什么?什么是双亲委派机制以及为什么要打破双亲委派机制? 类的生命周期 类的生命周期包含了如上的7个阶段,其中验证.准备.解析统称为连接 ,类的加载主要是前五个阶段,每个阶段基本上保持如上顺序开始…
1.双亲委派机制及作用 1.1 什么是双亲委派机制 当某个类加载器需要加载某个.class文件时,它首先把这个任务委托给他的上级类加载器,递归这个操作,如果上级的类加载器没有加载,自己才会去加载这个类. 1.2 类加载器的类别 BootstrapClassLoader(启动类加载器) c++编写,加载java核心库 java.*,构造ExtClassLoader和AppClassLoader.由于引导类加载器涉及到虚拟机本地实现细节,开发者无法直接获取到启动类加载器的引用,所以不允许直接通过引用…
双亲委派机制存在的意义 双亲委派只是一种说法,个人觉得叫单亲委派更合适,因为向上传递的父类只有一个,估计只是翻译过来的,形成的一种习惯,大家可以当做单亲委派 四种加载器都是用于类的加载,只是加载的对象不一样 bootstrap ClassLoader -负责核心JRE的类库加载,如rt.jar, charsets.jar等 Extension ClassLoader -负责加载拓展目录ext中的jar类包 Application ClassLoader -负责加载ClassPath路径下的类包…
一.JVM内存结构 ▷ 谈及内存结构各个部分的数据交互过程:还可以再谈及生命周期.数据共享:是否GC.是否OOM 答:jvm 内存结构包括程序计数器.虚拟机栈.本地方法栈.堆.方法区:它是字节码运行时的数据区,针对字节码,就会有一个具体的分配. 对于类信息本身,需要把它存储在方法区: 针对字节码对应的类要执行的时候,相应的还需要new 对象,就需要在堆空间 new 对象: 对应的执行过程中,都是一些方法的调用,需要在虚拟机栈分配栈帧,代表一个一个的方法的调用. 在整个过程中需要用到程序计数器,来…
前言 java反射,最常用的Class.forName()方法.做毕设的时候,接收到代码字符串,通过 JavaCompiler将代码字符串生成A.class文件(存放在classpath下,也就是eclipse项目中的bin目录里),然后通过java反射机制,获取main方法并执行..class文件名称固定.当 A.class文件更新的时候,问题出现了,main方法的执行结果总和第一次的执行结果相同. 程序流程 代码提交->接收代码->编译成A.class文件->java反射->m…
类加载器是 Java 语言的一个创新,也是 Java 语言流行的重要原因之一.它使得 Java 类可以被动态加载到 Java 虚拟机中并执行.类加载器从 JDK 1.0 就出现了,最初是为了满足 Java Applet 的需要而开发出来的.Java Applet 需要从远程下载 Java 类文件到浏览器中并执行.现在类加载器在 Web 容器和 OSGi 中得到了广泛的使用.一般来说,Java 应用的开发人员不需要直接同类加载器进行交互.Java 虚拟机默认的行为就已经足够满足大多数情况的需求了.…