JAVA-大白话探索JVM-类加载器(一)
JVM???
Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。JVM是Java Virtual Machine(Java虚拟机)的缩写,Java程序编译后,产生.class文件,并不是在CPU上执行,而是由JVM执行,JVM屏蔽了与具体平台相关的信息,针对平台开发其对应的解释器,Java 虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。因此实现java平台无关性。从而实现 一次编译,到处运行。
所以,JVM是啥??
不急不急。
先听我讲个故事,从前有座山,山里有座庙···,呃…,错了,再来
从前有名学生,name叫猫猫,手持iphone6,戴着耳机,在课上偷听歌。~囧架架,囧架架。
之后再因缘巧合之下,猫猫荣获7p,那么,问题来了,还能继续使用该耳机吗? 当然是无法使用。
当你使用6的耳机时,却发现怎么也无法使用在iphone7p上(头尾不对),那怎么办??这时转接口就派上用场了。
只需将耳机线完美插入洞里,然后就可以在课上偷偷听歌了。。。呃…
同理,JVM 可以理解为“转接口”,JVM 就是为了方便开发者在编译完java代码后,在不同系统都可运行。做到一次编译,到处运行。
囧架架~~囧囧架
JVM = 类加载器 classloader + 执行引擎 execution engine + 运行时数据区域 runtime data area
现在我们知道JVM是什么了,那来说说看是编译后的.class是怎么加载到内存中的。
类加载器
话不多说,直接上图
我知道看不懂。我也看不懂。哈哈…
不急,先知道是干啥用的。
类加载器
作用:装载.class文件
指将类.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后堆中创建一个java.lang.Class对象,用来封装类在方法区的数据结构。
注:类加载器并不需要等到某个类被“首次主动使用”时再加载它,JVM规范允许类加载器在预料某个类将要被使用时就预先加载它
讲类加载器,一定要知道的机制
双亲委派模型(Parent Delegation Model)
双亲委派模型中除了启动类加载器之外其余都需要有自己的父类加载器,如图中Bootstartp ClassLoader。子类加载器和父类加载器不是以继承的关系来实现,而是通过组合关系来复用父加载器的代码。
过程
- 当前 ClassLoader 首先从自己已经加载的类中查询是否此类已经加载,如果已经加载则直接返回原来已经加载的类。没有的话,就会收到了类加载请求,自己不会首先加载,而是委派给父加载器进行加载,每个层次的加载器都是这样。直到Bootstartp ClassLoader
每个类加载器都有自己的加载缓存,当一个类被加载了以后就会放入缓存,
等下次加载的时候就可以直接返回了。
好处
双亲委派的好处 : 主要是为了安全性,避免用户自己编写的类动态替换 Java 的一些核心类,由于每个类加载都会经过最顶层的启动类加载器,比如 java.lang.Object这样的类在各个类加载器下都是同一个类(只有当两个类是由同一个类加载器加载的才有意义,这两个类才相等。)
如果没有双亲委派模型,由各个类加载器自行加载的话。当用户自己编写了一个 java.lang.Object类,那样系统中就会出现多个 Object,这样 Java 程序中最基本的行为都无法保证,程序会变的非常混乱。
各类加载器作用
Bootstartp ClassLoader : 加载核心api。
Extension ClassLoader : 加载出了基本 API 之外的一些拓展类。
App ClassLoader : 加载应用程序和程序员自定义的类。
Custom ClassLoader : 供用户自定义加载class
················
················
················
等等,说好的大白话呢
类加载器,顾名思义,加载.class的器,呃····,将就一下
加载过程中,并非顺序加载,而是等需要使用到,就去主动加载。
就像人吃饭,我想吃炸鸡,但是餐厅却一直给我青菜,这很不科学,那怎么办。
我:老板,来一份炸鸡,那就预先主动去点(加载)炸鸡。
然后就是双亲委托模型。
老板:来了,老弟。
客户要炸鸡,那就要命令厨房下厨,厨房发现没鸡(未被加载此类),怎么办?开始委托老板要鸡。
厨房马上找老板,然后老板在仓库找找,也发现没鸡(也未被加载此类),怎么办?开始委托供应商要鸡。
这就得找供应商生产鸡了(加载.class)。
ε=(´ο`*)))唉,吃个炸鸡这么麻烦,不过看老板那么热心。
下次来吃,这次厨房有鸡了(此类已经加载,直接返回),炸鸡也就很快上了。
至于好处。你会发现,我吃的鸡都来自同一供应商(保证自己编写的类属于同一个)。
好了,结束了,下篇再讲讲类加载装载过程。先去吃吃炸鸡咯~~~
版权声明:本文为不会代码的小白原创文章,转载需添加小白地址 :https://www.ccode.live/bertonlee/list/6?from=art
欢迎关注
欢迎关注公众号“码上开发”,每天分享最新技术资讯
JAVA-大白话探索JVM-类加载器(一)的更多相关文章
- 【java虚拟机系列】JVM类加载器与ClassNotFoundException和NoClassDefFoundError
在我们日常的项目开发中,会经常碰到ClassNotFoundException和NoClassDefFoundError这两种异常,对于经验足够的工程师而言,可能很轻松的就可以解决,但是却不一定明白为 ...
- 从 1 开始学 JVM 系列 | JVM 类加载器(一)
从 1 开始学 JVM 系列 类加载器,对于很多人来说并不陌生.我自己第一次听到这个概念时觉得有点"高大上",觉得只有深入 JDK 源码才会触碰到 ClassLoader,平时都是 ...
- JVM 类加载器命名空间深度解析与实例分析
一.创建Sample 1.创建实例 public class MyPerson { private MyPerson myPerson; public void setMyPerson(Object ...
- JVM 类加载器深入解析以及重要特性剖析
1.类加载流程图 从磁盘加载到销毁的完整过程. 2.类加载流程图2 1.加载: 就是把二进制形式的java类型读入java虚拟机中 2.连接: 验证.准备.解析. 连接就是将已经读入到内存的类的二进制 ...
- JVM 类加载器ClassLoader源码学习笔记
类加载 在Java代码中,类型的加载.连接与初始化过程都是在程序运行期间完成的. 类型可以是Class,Interface, 枚举等. Java虚拟机与程序的生命周期 在如下几种情况下,Java虚拟机 ...
- (二十七)JVM类加载器机制与类加载过程
一.Java虚拟机启动.加载类过程分析 下面我将定义一个非常简单的java程序并运行它,来逐步分析java虚拟机启动的过程. package org.luanlouis.jvm.load; impor ...
- 进阶Java编程(11)ClassLoader类加载器【待完成】
1,ClassLoader类加载器简介 在Java里面提供一个系统的环境变量:ClassPath,这个属性的作用主要是在JVM进程启动的时候进行类加载路径的定义,在JVM里面可以根据类加载器而后进行指 ...
- 深入JVM类加载器机制,值得你收藏
先来一道题,试试水平 public static void main(String[] args) { ClassLoader c1 = ClassloaderStudy.class.getClass ...
- Java安全之 ClassLoader类加载器
Java安全之 ClassLoader类加载器 0x00 前言 前面这里抛出一个问题,Java到底是什么类型的编程语言?是编译型?还是解释型?在这个问题是其实一直都都有疑惑,如果说是解释型语言的话,那 ...
- JVM类加载器的分类
类加载器的分类 JVM支持两种类型的类加载器,分别为引导类加载器(Bootstrap ClassLoader)和自定义类加载器(User-Defined ClassLoader). 从概念上来讲,自定 ...
随机推荐
- log4php的使用方法与详细配置
log4php的使用 首先引入logger.php文件.log4php可以通过引入logger.php来完成自动加载的过程.文件位置如下: 日志记录器自身没有定义日志的输出目的地和格式,所以我们通常需 ...
- 浏览器的F5和Ctrl+F5
在浏览器里中,按F5键和按F5同时按住Ctrl键(简称Ctrl+F5),效果是不同,到底两者有什么区别呢? 假如我第一次访问过http://localhost/home,这个网页是个动态网页,每次访问 ...
- hive数据导入load导入命令
LOCAL 指的是操作系统的文件路径,否则默认为HDFS的文件路径 1.向t2和t3的数据表中导入数据 2.导入操作系统的一下三个文件 执行导入命令 3.将HDFS文件中的数据导入到t3中 4.导入 ...
- CentOS 安全优化
1.操作系统和数据库系统管理用户身份鉴别信息令应有复杂度要求并定期更换. 配置# vi /etc/login.defs 系统默认配置: PASS_MIN_LEN=5 #密码最小长度 PASS_MAX_ ...
- delphi 的 LockType 锁类型
LockType 锁类型 常数 值 说明 ...
- SQL连接:内连接、外连接、交叉连接。
SQL连接可以分为内连接.外连接.交叉连接. 数据库数据: book表 stu表 1.内连接 ...
- python基础成长之路四-基础数据类型方法
1,程序开发三大流程: 顺序--从上向下,顺序执行代码 分支--根据条件判断,决定执行代码的分支 循环--让特定的代码重复执行 2,whlie循环语句: Break 某一条件满足时,退出循环,不在执行 ...
- LOJ #2721. 「NOI2018」屠龙勇士(set + exgcd)
题意 LOJ #2721. 「NOI2018」屠龙勇士 题解 首先假设每条龙都可以打死,每次拿到的剑攻击力为 \(ATK\) . 这个需要支持每次插入一个数,查找比一个 \(\le\) 数最大的数(或 ...
- 自学Linux Shell11.1-shell概述
点击返回 自学Linux命令行与Shell脚本之路 11.1-shell概述 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计 ...
- cf1063B Labyrinth (bfs)
可以证明,如果我搜索的话,一个点最多只有两个最优状态:向左剩余步数最大时和向右剩余步数最大时 然后判一判,bfs就好了 dfs会T惨... #include<bits/stdc++.h> ...