JVM类加载器

jvm类加载器 类加载器(ClassLoader)是Java虚拟机提供给应用程序去实现获取类和接口字节码数据的技术。它会通过二进制流的方式获取到字节码文件的内容,然后将获取到的数据交给Java虚拟机。虚拟机会在方法区和堆上生成对应的对象保存字节码信息。 阅读详情

类的加载指的是将类的.class文件中的二进制数据读取到内存中,将其放在运行时数据的方法区内,然后在内存中创建一个java.lang.Class对象(规范并说明Class对象位于在哪里,HotSpot虚拟机将其放在了方法去中)用来封装类在方法去内的数据结构。

  1. 在java代码中,类型的加载、连接与初始化的过程都是在程序运行期间完成的
  2. 提供了更大的灵活性,增加了更多的可能性

一.类的五个阶段

  1. 加载:查找并加载类的二进制数据
  2. 连接:
    • 验证:确保被加载类的正确性
    • 准备:为类的静态变量分配内存,并将其初始化为默认值
    • 解析:把类中的符号引用转换为直接引用
  3. 初始化:为类的静态变量赋予正确的初始值
  4. 使用
  5. 卸载
//假设
class Test {

    public static int a = 1;

}

//在连接的准备阶段虚拟机会把a赋予默认值0分配空间,而在初始化阶段才会赋予正确的值

二、在如下情况下java虚拟机会结束生命进程

  1. 执行System.exit()
  2. 程序正常执行结束
  3. 程序在执行中遇到错误异常终止
  4. 由于操作系统错误导致的java虚拟性进程终止

三、Java类的使用

  1. Java程序对类的使用方式可以分为两种
    1. 主动使用
    2. 被动使用
  2. 所有的java虚拟机实现必须在每个类的接口被java程序“首次主动使用”时才初始化他们

  1. 主动使用(七种) 本质根据虚拟机的助记符的使用
    1. 创建类的实例             getstatic
    2. 访问某个类或者接口的静态变量,或者对该静态变量赋值     putstatic
    3. 调用类的静态方法        invokestatic
    4. 反射(如Class.forName(“com.test.Test”))
    5. 初始化一个类的子类
    6. Java虚拟机启动时被标明为启动类
    7. Jdk1.7开始提供的动态语言支持:java.lang.invoke.MethodHandler实例的解析结果REF_getStatic,REF_putStatic,REF_invokeStatic句柄的类没有初始化,则进行初始化
  1. 被动使用
    1. 其他使用方式不会导致类的初始化产生,但有可能加载和连接
public class TestClassLoader {

	public static void main(String[] args) {
		System.out.println(Children.value);
		//打印结果为init parent 和 parent
		//Children类并没有被初始化,原因是该类并没有被主动使用
	}
}

class Parent {
	
	public static String value = "parent";
	
	static {
		System.out.println("init parent");
	}
}

class Children extends Parent {
	
	public static String value2 = "child";
	
	static {
		System.out.println("init children");
	}
}

关于类加载与常量池的实例

/**
 * 类加载与常量池
 * @author Administrator
 *
 */

public class TestClassLoader2 {

	public static void main(String[] args) {
		System.out.println(Parent2.value);
		//打印结果为parent
		
		//当使用final关键字后在编译阶段,常量被存入到调用这个方法所在类的常量池中
		//就是说在TestClassLoader2的常量池中,之后TestClassLoader2和Parent2就没有任何关系了
		//甚至,我们可以将Parent2的class删除
		//本质上调用类并不会直接引用到定义常量的类
		//因此并不会触发定义常量的类的初始化
		
	}
}

class Parent2 {
	
	public static final String value = "parent";
	
	static {
		System.out.println("init parent");
	}
}

示例2:

public class TestClassLoader3 {

	public static void main(String[] args) {
		System.out.println(Parent3.value);
		//打印结果为
		//init parent
		//016391ec-6e45-4ffd-a3ed-a3391f633d09
		//当value = UUID.randomUUID().toString()时编译阶段无法获取value的值
		//必须要对类进行初始化后才能得到
		//当一个常量在编译期间无法确定,就不会放到调用类的常量池中
	}
}

class Parent3 {
	
	public static final String value = UUID.randomUUID().toString();
	
	static {
		System.out.println("init parent");
	}
}

四、JVM参数的使用

-XX:+<option>, 表示要开启option选项

-XX:-<option>, 表示要关闭option选项

JVM提供大量参数有些参数默认开启有些默认关闭,”+”,”-”为参数开关

-XX:<option>=<value>

表示将option的值设置为value

五、简单的助记符:

Idc表示将int,float,String类型的常量值从常量池推送至栈顶

bipush表示将单字节(-128,127)的常量值推送至栈顶

sipush表示将一个短整型常量值(-32768,32767)的常量值推送至栈顶

iconst_1表示将int类型1推送至栈顶(-1,0,1,2,3,4,5)特殊

Iconst_m1 表示将int类型-1推送至栈顶

高频仿真:高频天线设计_(4).天线参数分析与优化 通过上述步骤,我们展示了如何综合使用解析方法、数值优化方法和实验数据来设计和优化一个高效宽带天线。首先,我们通过解析方法确定了天线的初步长度;然后,使用遗传算法优化了天线的直径以最大化增益;最后,通过实验数据验证了天线的性能,包括驻波比和带宽。这一综合性方法可以有效地提升天线的设计和优化效果,确保其在实际应用中表现出色。 阅读详情

相关推荐

深入解析STM32F40x CAN控制器的配置与优化

本文深入解析STM32F40x CAN控制器的配置与优化,涵盖基础工作模式、波特率计算、筛选器配置及中断管理等关键技术。通过实战案例和代码示例,帮助开发者高效配置CAN通信,提升工业控制系统的稳定性和性能。

weixin_26834815的博客 221

JVM参数调节及类加载

常见参数配置 XX:+PrintGC 每次触发GC的时候打印相关日志 -XX:+UseSerialGC 串行回收 -XX:+PrintGCDetails 更详细的GC日志 -Xms 堆初始值 -Xmx 堆最大可用值 -XX:NewSize(-Xns) 年轻代内存初始大小 -Xss 设置栈大小 -XX:MaxNewSize...

Damon_zqt的博客 693

计量经济学——事件研究法/事件分析法

计量经济学——事件研究法/事件分析法

weixin_46189461的博客 6752

JVM 类加载器

根据官方 API 文档的介绍:类加载器是一个负责加载类的对象。是一个抽象类。给定类的二进制名称,类加载器应尝试定位或生成构成类定义的数据。典型的策略是将名称转换为文件名,然后从文件系统中读取该名称的“类文件”。每个 Java 类都有一个引用指向加载它的。不过,数组类不是通过创建的,而是 JVM 在需要的时候自动创建的,数组类通过方法获取的时候和该数组的元素类型的是一致的。类加载器是一个负责加载类的对象,用于实现类加载过程中的加载这一步。

c630843901的博客 1632

视频教程-SAP S4 HANA FICO COPA 获利能力分析-ERP

SAP S4 HANA FICO COPA 获利能力分析 从业超过8年的SA...

weixin_33456805的博客 1442

Alipay 支付唤起 h5 测试

测试地址 https://recharge.apps.oppomobile.com/recharge-center/recharge/?from=message try { //唤起客户端快捷参数 var data = {"requestType":"SafePay","fromAppUrlScheme":"alipays","dataString":"h5_ro...

六桥风月IT随笔 1万+

JVM-类加载器

类加载器子系统负责从文件系统或者网络中加载Class文件,Class文件在文件开头有特定的文件标识,ClassLoader只负责加载Class文件,是否运行取决于ExecutionEngine。加载的类信息存放于一块成为方法区的内存空间。除了类的信息外,方法区中还会存放运行时常量池信息,可能还包括字符串字面量和数字常量(这部分常量信息是Class文件中常量池部分的内存映射)。- 通过一个类的全限定名获取定义此类的二进制字节流- 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。

qq_41149775的博客 2108

WPF+Prism+LiveCharts+materialdesignin 搭建WPF开发框架

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容。

T_Tboy的博客 3051

JVM类加载器详解

类加载器虽然只用于实现类的加载动作,但它在Java程序中起到的作用却远超类加载阶段。对于任意一个类,都必须由加载它的类加载器和这个类本身一起共同确立其在Java虚拟机中的唯一性,一个类加载器,都拥有一个独立的类名称空间。

weixin_46425661的博客 1004

R语言安装包镜像报错?5分钟教你快速切换国内镜像源(含清华/阿里云配置)

本文详细介绍了R语言安装包镜像报错的解决方案,包括如何快速切换国内镜像源(如清华、阿里云等),解决'无法读写貯藏處索引'等常见问题。通过图形界面和命令行两种方式,帮助用户高效配置镜像源,提升R语言包安装速度与稳定性。

weixin_29053073的博客 418

【100%通过率】华为OD机试真题 JavaScript【数字最低位排序】【最低位排序】

2023华为OD机试真题 JavaScript【数字最低位排序】【最低位排序】 给定一个非空数组(列表) 起元素数据类型为整型 请按照数组元素十进制最低位从小到大进行排序 十进制最低位相同的元素,相对位置保持不变 当数组元素为负值时,十进制最低为等同于去除符号位后对应十进制值最低位

MISAYAONE的博客 587

JVM——类加载器

讲解了JVM三种类加载器,即启动类加载器、扩展类加载器和应用程序类加载器,同时讲解了类加载器的源码,以及用户根据自己需求自定义类加载器,此外还介绍了它们之间的包含关系以及类加载器所采用的双亲委派机制。

码说芯语的博客 1562

Altium Designer(AD24/25)导出DXF或DWG结构文件的方法

DXF(Drawing Exchange Format)和DWG(Drawing)是两种常见的CAD(计算机辅助设计)文件格式,常用于结构和硬件之间的沟通。本文介绍Altium Designer(AD24/25)导出DXF或DWG结构文件的方法。

fydar的博客 2323

【JVM】深入理解 JVM 类加载器

除启动类加载器外,所有类加载器都有一个父加载器;当需要加载一个类时,当前类加载器会先将请求委派给父加载器,只有父加载器无法加载时,才尝试自己加载。这里的 “双亲” 并非指两个父加载器,而是层级委派关系(更准确地说应称为 “单亲委派”)。类加载器之间的父子关系通过组合而非继承实现(类通过parent字段持有父加载器引用)。JVM 允许开发者通过继承类实现自定义类加载器,以满足特殊需求(如加密字节码、从网络加载类等)。// 类加载路径@Overridetry {// 1. 读取字节码文件。

m0_61057201的博客 924

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

JVM类加载器(详解)

JVM类加载器 1.类加载子系统的作用 类加载器子系统负责从文件系统或者网络中加载class文件,class文件在文件开头有特定的文件标识。 2.类加载过程 当程序主动使用某个类时,如果该类还未被加载到内存中,则JVM会通过加载、连接、初始化3个步骤来对该类进行初始化。如果没有意外,JVM将会连续完成3个步骤,所以有时也把这3步骤统称为类加载或类初始化。 类被加载到 JVM 开始,到卸载出内存,整个生命周期如图: 1.加载 通过类名(地址)获取此类的二进制字节流。 将这个字节流所代表的静态存储结构转换

qdzjo的博客 7919

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

【JVM】一文详解类加载器

Java中的类加载机制是指在Java程序运行时,将类文件(通常是.class文件)加载到内存中的一系列步骤和过程。这一机制确保了类能够在需要的时候被正确、安全地加载到Java虚拟机(JVM)中,并进行初始化和使用。Java的类加载机制遵循着“按需加载”原则,即只有在需要用到某个类的时候,才会加载该类。是Java的核心组件,所有的Class都是由进行加载的,负责通过各种方式将Class信息的二进制数据流读入JVM内部,转换为一个与目标类对应的对象实例。jvm虚拟机对class文件采用的是按需加载。

2301_78320637的博客 1810

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

JVM的类加载器

JVM只会运行二进制文件,类加载器的作用就是将字节码文件加载到JVM中,从而Java程序能够启动起来。加载某一个类,先委托上一级的加载器进行加载,如果上级加载器也有上级,则会继续向上委托如果该类委托上级没有被加载,子加载器尝试加载该类加载:查找和导入class文件验证:保证加载类的准确性准备:为类变量分配内存并设置类变量初始值解析:把类中的符号引用转换为直接引用初始化:对类的静态变量,静态代码块执行初始化操作使用:JVM 开始从入口方法开始执行用户的程序代码。

2301_81453175的博客 1641

JVM 类加载器详解

想加载非 classpath 随意路径中的类文件通过接口来使用实现,希望解耦时,常用在框架设计和SPI思想这些类希望予以隔离,不同应用的同名类都可以加载(其实就是违背双委机制的意义1),不冲突,常见于 tomcat 容器。

fengdongnan的博客 1083

我把JVM的类加载器整理了一下

前言 ​ 之前去面试的时候面试官问了我关于关于JVM性能调优的问题,由于自己之前公司的项目里自己没有接触到JVM性能调优的相关问题(感觉这些都是公司架构师考虑的问题),所有面试官问的时候自己一脸懵逼,所有最后的结果当然是凉凉。。,于是,为了查漏补缺,就去学习了一下JVM的相关知识,希望能帮助到大家。 正文 ​ 在学习任何一项新的知识之前,我都会先列出一份学习大纲,然后按照这个学习大纲一步一步的来学习了解,所以学习JVM这个新的技术,我也分为了3个板块来学习:JVM类加载器,JV

码到成功 772

jvm中的类加载器

在Java的日常应用程序开发中,类的加载几乎是由上述3种类加载器相互配合执行的,在必要时,我们还可以自定义类加载器,来定制类的加载方式。隔离加载类修改类加载的方式扩展加载源防止源码泄漏开发人员可以通过继承抽象类java.lang.classLoader类的方式,实现自己的类加载器,以满足一些特殊的需求。

perturb的博客 706
上一篇: 简单的protobuf序列化与反序列化的例子
下一篇: JVM类的初始化步骤
等风来_aa
博客等级 码龄9年 6粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值