话不多说,先上图。

***.class文件执行大概就是这样来走的。我们都知道我们的java文件经过编译以后会生成对应的class文件。先经过类装载子系统,然后塞进运行时内存模型的元空间,开始执行方法,对象放在堆,线程开辟栈空间,程序计数器控制执行顺序。字节码执行引擎整体调控程序计数器,走你。。。大概就是这样的。我们先来看一下类装载子系统是如何工作的。

  类装载子系统大概分为,验证->准备->解析->初始化。笼统的来说就这个4个步骤。

1,验证:验证我们的编译文件(字节码文件)是否正确。

2,准备:给予类的静态常量开辟堆空间。并且赋予默认值。对象也在这个时候放置在堆空间,并且给予空值。

3,解析:将符号引用替换为直接引用,该阶段会把一些静态方法(符号引用,比如main()方法)替换为指向数据所存内存的指针或句柄等(直接引用),这是所谓的静态链接过程(类加载期间完成),动态链接是在程序运行期间完成的将符号引用替换为直接引用。就像是我们把main转化为001,将()转化为002,将这一系列的编码存在堆上。

4,初始化,将第3步的静态常量(或对象)赋值,执行静态代码块。

类的加载器大致分为,启动类加载器,扩展类加载器,应用类加载器和自定义加载器,后面我们会说如何实现自己的类加载器。

启动类加载器是用来加载java自身的lib包的。用C语言实现的,我们是看不到的。

扩展类加载器顾名思义,是加载java的扩展包的。加载ext包下的jar包

然后就是我们的应用加载器,来执行我们一行行代码的。

最后才是我们的自定义加载器。我来看一段代码。

import com.sun.crypto.provider.DESKeyFactory;

public class Main {

    public static void main(String[] args) {
System.out.println(String.class.getClassLoader());
System.out.println(DESKeyFactory.class.getClassLoader().getClass().getName());
System.out.println(Main.class.getClassLoader().getClass().getName());
}
}

输入如下:

null
sun.misc.Launcher$ExtClassLoader
sun.misc.Launcher$AppClassLoader Process finished with exit code 0

三种加载器就是这样的。

 双亲委派机制:

  我们知道一个基础的知识,就是我们新建的java.lang.String是无法加载的,就是加载过程的双亲委派机制限制了我们自定义重写java本来的代码。

双亲委派是为了阻止我们重写java内部的类,做到了沙箱安全的目的。

  大概就是这样来实行的。上图:

自定义加载器会优先拿到要加载的文件,但是他不会去马上加载。而是直接交给应用类加载器,应用类加载器也不会管,继续向上走,交给扩展类加载器,他也不管,继续向上走,交给启动类加载器,没办法了,启动类加载器没法继续向上交付了。自己先试试可以加载吗?可以加载就加载,加载不了退返给扩展类加载器,扩展类看到是推回来的,试试吧。可以加载吗?可以加载就加载,加载不了退返给应用类加载器,应用类加载器可以加载就加载,加载不了退返给自定义加载器。这样一个由下到上,谁也不管。逐个去尝试往下推的方法去加载。好久就是为了防止你重写java内部的类。

  这里简单说一下自定义加载器。

我们只要重写com.sun.org.apache.bcel.internal.util;包下的ClassLoader类的findClass方法,最后调用defineClass方法。就可以实现我们的自定义加载器。

  这回我们再回过头来看上一篇博客的tomcat打破双亲委派机制也就懂得是怎么回事了吧。不懂的评论留言吧。就说到这里,我们下一次说一下jvm运行时内存模型那一块。

写的这么不好的文章能坚持读到最下面确实挺不易的,贡献一个小技巧,来看类是否真的被加载了。

最进弄了一个公众号,小菜技术,欢迎大家的加入

java架构之路-(JVM优化与原理)JVM类的加载机制的更多相关文章

  1. [转帖]java架构之路-(面试篇)JVM虚拟机面试大全

    java架构之路-(面试篇)JVM虚拟机面试大全 https://www.cnblogs.com/cxiaocai/p/11634918.html   下文连接比较多啊,都是我过整理的博客,很多答案都 ...

  2. jvm系列(一):java类的加载机制

    java类的加载机制 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装 ...

  3. JVM(1):Java 类的加载机制

    原文出处: 纯洁的微笑 java类的加载机制 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang. ...

  4. jvm系列 (五) ---类的加载机制

    类的加载机制 目录 jvm系列(一):jvm内存区域与溢出 jvm系列(二):垃圾收集器与内存分配策略 jvm系列(三):锁的优化 jvm系列 (四) ---强.软.弱.虚引用 我的博客目录 什么是类 ...

  5. 深入java虚拟机学习 -- 类的加载机制

    当看到"类的加载机制",肯定很多人都在想我平时也不接触啊,工作中无非就是写代码,不会了可以百度,至于类,jvm是怎么加载的我一点也不需要关心.在我刚开始工作的时候也觉得这些底层的内 ...

  6. 深入java虚拟机学习 -- 类的加载机制(续)

    昨晚写 深入java虚拟机学习 -- 类的加载机制 都到1点半了,由于第二天还要工作,没有将上篇文章中的demo讲解写出来,今天抽时间补上昨晚的例子讲解. 这里我先把昨天的两份代码贴过来,重新看下: ...

  7. Jvm类的加载机制

    1.概述 虚拟机加载Class文件(二进制字节流)到内存,并对数据进行校验.转换解析和初始化,最终形成可被虚拟机直接使用的Java类型,这一系列过程就是类的加载机制. 2.类的加载时机 类从被虚拟机加 ...

  8. java架构之路-(面试篇)JVM虚拟机面试大全

    下文连接比较多啊,都是我过整理的博客,很多答案都在博客里有详细说明,理解记忆是最扎实的记忆.而且我的答案不一定是最准确的,但是我的答案不会让你失望,而且几乎每个答案都是问题的扩展答案. 1.JVM内存 ...

  9. jvm系列一、java类的加载机制

    一.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构 ...

随机推荐

  1. NLP(二十四)使用LSTM构建生成式聊天机器人

    准备 数据集:AIML数据集 下载数据集并用Notepad++打开,复制到txt文件中方便打开 代码实现 数据很少,训练轮次不多,结果不好,仅当示例 import numpy as np import ...

  2. 【EDU68 E】 Count The Rectangles 数据结构算几何

    CF # 题意 总共有5000条线段,这些线段要么水平,要么垂直,问这些线段组成了多少矩形. # 思路 这是一个n*n*(log)的思路 自己一开始想着枚举两条垂直边,想着怎么把水平的边插入,再进行冗 ...

  3. Educational Codeforces Round 43 E&976E. Well played! 贪心

    传送门:http://codeforces.com/contest/976/problem/E 参考:https://www.cnblogs.com/void-f/p/8978658.html 题意: ...

  4. 牛课练习赛34 Flittle w and Discretization 主席树维护Mex

    ittle w and Discretization 主席树维护Mex. 每个右端点 r 维护出一棵 在[1, r ] 区间中 其他所有的 值离这个 r 最近的的位置是多少. 然后询问区间[L,R]的 ...

  5. 深入浅出TypeScript(4)- 使用接口和类型别名

    在TypeScript中,为了可以约束对象定义,提供了两个新的特性,接口和类型别名. TypeScript中的接口 在强类型语言中,都有接口的概念,那么TypeScript中的接口是如何使用的呢? 接 ...

  6. Unsolved输入格式错误1022

    https://pintia.cn/problem-sets/994805342720868352/problems/994805480801550336

  7. Fire Balls 09——修正游戏的BUG

    版权申明: 本文原创首发于以下网站: 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123 优梦创客的官方博客:https://91make.top ...

  8. 用lnmp架构部署wordpress网站详细步骤

    用lnmp架构部署wordpress网站 ①.下载和上传网站代码 用winscp或者xftp, 或者xshell下执行rz命令进行上传网站的包文件. ②.解压程序代码,并将程序代码保存到站点目录,并进 ...

  9. ORACLE官网JAVA学习文档

    Trails Covering the Basics   1 Getting Started 1.1 The Java Technology Phenomenon 1.1.1 About the Ja ...

  10. 史无前例的RNN讲解

    这篇博客不是一篇讲解原理的博客,这篇博客主要讲解time_steps,如果这篇博客没有让你明白time_steps,那么算我无能. 我曾翻阅各大网站,各大博客,他们的对RNN中time_steps的讲 ...