JVM系列(二):JVM中类加载器相关知识笔记

 

7003bc5a1adf6336d9771e3e64f63aa1.png

今天继续给大家分享JVM相关的知识,欢迎互相沟通交流!

1、什么是类的加载和类的卸载

JVM虚拟机运行的文件是class文件,它是由我们的Java程序编译后产生的文件。

类的加载:JVM虚拟机将指定的class文件读取到内存里,并解释运行该class文件里的Java程序的过程。

类的卸载:将某个class文件的运行时数据从JVM虚拟机中移除的过程。

2、什么是class文件

class文件是一组以8个字节为基本单位的二进制流,

各个数据项目严格按照顺序紧凑地排序在文件之中,

中间没有添加任何分隔符,如果当数据项需要占用8个以上字节位的时候,按照高位在前的方式分割成若干个8个字节存储

数码:class文件的解释运行时数据本质是C++对象,也叫做kclass对象,这些运行时数据在JDK7之前放在永久代(PermGen),JDK8之后放在元空间(Metaspace)。

3、class类的生命周期

加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)

0ca3cc1a7067547beb817e9a7371ddf3.png

 

 

4、类加载器的作用

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

5、类加载器的种类

cb4f92cad00b93bf27a634442654e4e3.png

 

5.1、Bootstrap ClassLoader (启动类加载器)

启动类加载器负责加载$JAVA_HOME中jre/lib/rt.jar里面所有的class,由c++实现,不是classLoader子类

296d70a6278db9b1c6958fbb7db00f6c.png

 

5.2、ExtensionClassLoader(扩展类加载器)

扩展类加载器由sun.misc.Launcher $ExtClassLoader实现,负责加载JRE的扩展目录,lib/ext或者由java.ext.dirs系统属性指定的目录中的JAR包的类。由Java语言实现,父类加载器为null。

5.3、App ClassLoader(应用类加载器)

由sun.misc.Launcher $App-ClassLoader实现负,记载classpath中指定的jar包以及目录中class, 程序员一般会直接使用这个类加载器,如果程序员没有定义自己的类加载器,就作为应用程序的默认加载器。

5.4、User ClassLoader(自定义类加载器)

大家开发的时候其实绝大多数都是使用应用类加载器,针对一些应用类加载器不能满足的情况下,可以考虑使用自定义类加载器,来满足实际开发的业务要求。

自定义类加载器场景:

Tomcat:每个WebApp有自己的ClassLoader,加载每个WebApp的ClassPath路径上的类,一旦遇到Tomcat自带的Jar包就委托给CommonClassLoader进行加载。

一些核心机密类库,可以会把字节码加密,这样加载类的时候就必须对字节码进行解密,可以通过findClass读取URL中的字节码,然后加密,最后把字节数组交给defineClass()加载。

5.5、示例

 

public static void main(String[] args) {Test test=new Test();System.out.println(test.getClass().getClassLoader()); // 输出结果: sun.misc.Launcher$AppClassLoader@18b4aac2System.out.println(test.getClass().getClassLoader().getParent()); //输出结果:sun.misc.Launcher$ExtClassLoader@10f87f48System.out.println(test.getClass().getClassLoader().getParent().getParent());//输出结果:null ,因为启动类加载器是 C/C++ 语言写的,所以输出为 nullSystem.out.println();
}

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/270043.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JVM系列(三):双亲委派机制笔记

今天给大家分享JVM系列之双亲委派机制相关的知识。 1、Java类加载的过程 Java类的加载过程是动态的,它不会一次性把程序所有的类全部加载后再运行,而是先保障程序运行的基础类加载到JVM虚拟机当中,其他的类,一般是再需要的时候才…

Python用MySQLdb, pymssql 模块通过sshtunnel连接远程数据库

安全起见,数据库的访问多半是要做限制的,所以就有一个直接的问题是,往往多数时候,在别的机器上(比如自己本地),是不能访问数据库的,给日常使用造成了很大不便。所以前几天做了个需求…

运维安全:微软远程桌面修改默认远程端口

远程桌面是网络管理员必备的技能,今天给大家聊聊Windows本身就自带的远程桌面功能,如何修改远程的默认端口(3389),让你的远程服务器更加安全。 下面给大家介绍一下如何修改远程桌面的默认端口,具体步骤如下…

Android Studio如何导出可供Unity使用的aar插件详解

前言 项目之前使用Eclipse导出的jar文件来做与Android交互,最近因为工作需要需使用Android Studio的aar文件,网上参考了部分文章,也结合自己的理解重新整理一下具体的方法,通过写一个测试Demo来表述Android Studio创建aar的过程与…

JVM系列(四):沙箱安全机制笔记

今天主要给大家分享JVM的沙箱安全机制笔记 1、沙箱机制的概念 Java安全模型的核心就是Java沙箱(sandbox)。 沙箱机制就是将Java代码限定只能在虚JVM虚拟机中特定的运行范围,并且严格限制代码对本地系统资源访问,通过这样的方式来保证对Java代码的有效隔…

JVM系列(五):native关键字用法介绍

今天继续给大家分享JVM中native关键字用法介绍 1、native概念 native关键字修饰的Java方法是一个原生态方法,方法对应的实现Java作用范围达不到,而是在用其他编程语言(如C和C)文件中实现。Java语言本身不能直接对操作系统底层进行…

ASP.NET Core 介绍和项目解读

1. 前言2. ASP.NET Core 简介 2.1 什么是ASP.NET Core2.2 ASP.NET Core的特点2.3 ASP.NET Core 项目文件夹解读 2.3.1 项目文件夹总览2.3.2 project.json和global.json2.3.1 Properties——launchSettings.json2.3.4 Startup.cs (1) 构造函数&#xff08…

JVM系列(六):JVM内存区域中程序计数器介绍

今天继续给大家分享JVM的相关知识,今天介绍一下JVM内存区域的程序计数器。 1、程序计数器概念 JVM中的程序计数寄存器(Program Counter Register)中Register的命名来源于CPU的寄存器,寄存器用来存储指令相关的现场信息。 CPU只…

JVM系列(七):虚拟机栈的相关知识介绍

今天继续给大家分享JVM系列的相关知识,今天介绍一下虚拟机栈的介绍。 1、虚拟机栈的概念 虚拟机栈也称为Java栈,Java每个main方法被执行的时候,JVM都会同步创建一个栈帧(Stack Frame),通过存储局部变量表…

JVM系列(八):堆(Heap)的相关知识介绍

目录 1、JVM堆的概念 2、JVM堆的特点 3、JVM堆的内部结构 3.1 组成 3.2 堆内存内部空间所占比例 3.3 永久代和元空间区别 4、堆空间的大小设置 5、堆空间垃圾回收 1、JVM堆的概念 JVM中的堆是用来存放对象的内存空间,几乎所有的Java对象、数组都存储在JVM的…

电脑技巧:Hyper-V安装UOS操作系统图文教程

今天给大家分享微软官方Hyper-v虚拟机管理软件安装UOS操作系统图文教程,感兴趣的朋友也可以下载试一试,当然有啥问题也可以互相沟通交流! 1、首先任务管理切换到性能选项卡,查看虚拟化是否已经启用,如果没有启用的话&…

JVM系列(九):MinorGC、MajorGC、FullGC垃圾回收介绍

今天给大家继续分享MinorGC、MajorGC、FullGC相关知识,如有不对的地方欢迎指正! 1、MinorGC (新生代垃圾回收) JDK1.8 堆内部结构 从年轻代空间(包括 Eden 和 Survivor 区域)回收内存被称为 Minor GC&…

JVM系列(十):JVM垃圾回收算法相关知识

今天给大家继续分享JVM垃圾回收算法相关知识,如有不对的地方欢迎指正。 JVM垃圾回收算法主要有标记清除、复制算法、标记整理、分代收集四种,下面来逐一介绍。 1、标记清除(Mark-Sweep) 标记清除作为最基础的垃圾回收算法&#…

Java8 拼接字符串 StringJoiner

StringJoiner是Java8新出的一个类,用于构造由分隔符分隔的字符序列,并可选择性地从提供的前缀开始和以提供的后缀结尾。省的我们开发人员再次通过StringBuffer或者StingBuilder拼接。 我们查看一下一下代码,试着猜一下。 1.简单的字符串拼接…