Java虚拟机(JVM)的动态类加载(Class Loading)

【Jvm】类加载机制原理、优化与实战大起底(Class Loading Mechanism):原来还可以这样玩! **JVM 的类加载器具有父子关系**,双亲委派机制是在`Java 1.2`后引入的,其工作原理的是 **,如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行,如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载器(Bootstrap Class Loader),如果启动类加载器可以完成类加载任务,就成功返回,否则就一层一层向下委派子加载器去尝试加载**,这就是`双亲委派模式`,即`每个儿子都很懒,每次有活就丢给父亲去干, 阅读详情
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> 1.介绍 Class Loaders是动态加载Java类与Resource的一种机制。它支持Laziness,type-safe linkage,user-defined extensibility和multiple communicating namespaces这4种特性。 l Lazy loading:Class只有在需要的时候才加载。这样减少了内存使用量,能提高系统反映速度; l Type-safe linkage:动态类加载不会破坏JVM的类型安全; l User-definable class loading policy:开发者可以自定义的类加载器,控制动态类加载过程; l Multiple namespaces:JVM允许使用不同的类加载器加载相同的Class名称,但不同内容的类。 Class Loaders早在JDK1.0时就已存在,最开始的目的是使HotJava浏览器能加载Applet。从那以后,动态类加载机制被广泛应用到其他方面,例如web application server中Servlets的加载。class loader在JDK 1.0,1.1版本存在的缺陷,已经在JDK 1.2解决,其缺陷主要是编写不正确的Class Loader会造成类型安全问题。 2.Class Loaders Class Loader的目的是动态加载Java类和Resource。Java类是平台无关的,标准的,具有规范二进制文件格式的。class文件有编译器生成,可以被任何一中JVM加载。Java类的表现形式不仅只有.class文件,还可以为内存buffer,或是网络数据流。 JVM执行class文件内的Byte code。但是Byte code不是class文件的全部内容,class文件内还包含符号表,表示类,属性和方法名,以及类内引用到其他类,属性,和方法名。例如下面的类 class C{ void f(){ D d=new D(); } } 类文件内类C引用D。为了能让JVM知道D类是什么,JVM必须要先load D的class file并创建D class对象。 JVM使用类加载器加载类文件,并创建Class对象。类加载器都是ClassLoader的子类实例。ClassLoader.loadClass方法通过获得一个类名,返回一个Class对象,表示该类的类型。上面的代码里,假设C被类加载器L加载,则L是C的加载器。JVM将使用L加载所有被C引用到的其他Java类。 如果D还没有被加载,L将加载D: L.loadClass(“D”) 当D已经被加载,JVM就可以创建D的一个对象实例。 一个Java应用程序可以使用不同类型的类加载器。例如Web Application Server中,Servlet的加载使用开发商自定义的类加载器, java.lang.String在使用JVM系统加载器,Bootstrap Class Loader,开发商定义的其他类则由AppClassLoader加载。在JVM里由类名和类加载器区别不同的Java类型。因此,JVM允许我们使用不同的加载器加载相同namespace的java类,而实际上这些相同namespace的java类可以是完全不同的类。这种机制可以保证JDK自带的java.lang.String是唯一的。 ClassLoader子类需要重载loadClass方法以实现用户自己的类加载方式,下面是自定义一个类加载器例子: package org.colimas.webapp; import java.io.File; import java.io.IOException; import java.net.URL; import java.net.URLClassLoader; import java.util.StringTokenizer; /** *类加载器加载Servlet,URLClassLoader是ClassLoader的一个子类,可以通过URL加载Java类或其它资源。 * @author 趙磊 * */ public class WebAppClassLoader extends URLClassLoader { private ClassLoader _parent; public WebAppClassLoader(ClassLoader parent) { super(new URL[0], parent); _parent=parent; if (parent==null) throw new IllegalArgumentException("no parent classloader!"); } //追加一个Class Path。 public void addClassPath(String classPath) throws IOException{ if (classPath == null) return; StringTokenizer tokenizer= new StringTokenizer(classPath, ",;"); while (tokenizer.hasMoreTokens()) { URL url=null; File file=new File(tokenizer.nextToken()).getCanonicalFile(); url=file.toURI().toURL(); addURL(url); } } //加载类 public synchronized Class loadClass(String name) throws ClassNotFoundException { return loadClass(name,false); } protected synchronized Class loadClass(String name, boolean resolve) throws ClassNotFoundException { Class c= findLoadedClass(name); ClassNotFoundException ex= null; if (c == null && _parent!=null ){ try{ c= _parent.loadClass(name); }catch (ClassNotFoundException e){ ex= e; } } if (c == null){ try{ c= this.findSystemClass(name); }catch (ClassNotFoundException e){ ex= e; } } if (c == null) throw ex; if (resolve) resolveClass(c); return c; } } loadClass方法中使用findLoadedClass方法检查类是否已经被加载。该方法是Native方法,实现在JVM的ClassLoader.c文件内的Java_java_lang_ClassLoader_findLoadedClass函数。如果返回为null,则表示类还没有被加载,于是在其Parent类加载器重寻找_parent.loadClass,如果仍然返回null,则要在系统中查找,findSystemClass,如果仍然没有,则抛出异常。我们要确保多线程在同一时间只能加载一次,因此需要synchronized。 通常我们需要动态更新一个Class。例如一个Servlet实现发生变化时,我们希望不是重启服务器而是Reload。下面的类ServletWrapper提供了一个Servlet Reload的实现方法: package org.colimas.webapp; import javax.servlet.Servlet; import javax.servlet.ServletConfig; import javax.servlet.ServletException; /** * @author 趙磊 * */ public class ServletWrapper { private Servlet theServlet; private Class servletClass; private ServletConfig config; private String _servletname; public ServletWrapper(ServletConfig config){ this.config=config; } public Servlet getServlet() throws ServletException{ synchronized (this) { destroy(); try { WebAppClassLoader loader=new WebAppClassLoader(this.getClass().getClassLoader()); String name=getServletName(); servletClass = loader.loadClass(name); theServlet = (Servlet) servletClass.newInstance(); } catch( ClassNotFoundException ex1 ) { } catch( InstantiationException ex ) { }catch(IllegalAccessException ex2){ } theServlet.init(config); } return theServlet; } public void destroy() { if (theServlet != null) { theServlet.destroy(); } } protected String getServletName(){ return _servletname; } } getServlet()获得一个Servlet对象。首先创建一个新的Servlet类加载器。loader.loadClass加载最新的Servlet,servletClass.newInstance()实例化新的Servlet对象,并theServlet.init(config);让它运行起来。这种方法只有在不改变Servlet的接口时有效的。如果你要加载的类不实现任何接口,那么就不能在ServletWrapper直接使用该类名。而是定义为Object theServlet,并且theServlet = servletClass.newInstance();,而theServlet.init(config);也不得不改写为: Method m= servletClass.getMethod(“init”,…); m.invoke(theServlet,…); 3. Type-safe Linkage和Namespace一致性 JVM使用loaded class cache保存class名和加载该class的类加载器。当JVM通过loadClass获得class之后,它执行以下操作: l 检查传给loadClass的类名是否和真实类名一致; l 如果一致,则保存到loaded class cache里。 ClassLoader.findLoadedClass就是在loaded class cache查找class是否存在的。 为了保证Type-safe,Sun公司做了很多工作,目前也有不止一个解决方案。例如,增加约束规则(Contraint Rule)等。
MRI图像切片(nii格式转2D) 代码参考:将一个MRI(nii格式)数据进行切片 想要批量抽取MRI数据的几个切片,借鉴了上述代码的Python版本,原始代码抽取了全部切片。本次实验主要是抽取sMRI的横断面(axial)方向的其中30张切片,数量根据自己需求可自行设置。 import scipy, numpy, shutil, os, nibabel import sys, getopt import imageio def niito2D(filepath): inputfiles = os.listdir(filep 阅读详情

相关推荐

Kubernetes集群环境搭建与初始化

Kubernetes是Google开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。在生产环境中部署一个应用程序时,通常要部署该应用的多个实例以便对应用请求进行负载均衡。在Kubernetes中,我们可以创建多个容器,每个容器里面运行一个应用实例,然后通过内置的负载均衡策略,实现对这一组应用实例的管理、发现、访问,而这些细节都不需要运维人员去进行复杂的手工配置和处理。

m0_75254642的博客 1526

类加载到JVM过程

参考学习: www.mayikt.com 图灵 1.1 学习目标 从java.exe开始分析Java类加载运行过程 从JDK源码分析JVM核心类加载机制 从JDK源码分析类加载双亲委派机制 Tomcat类加载机制深度剖析 手写Tomcat类加载器实现多版本共存隔离 1.2 类加载到JVM过程 1.2.1 Java命令执行代码的大体流程 public class Math { public static final int initData = 666; public static U.

KevinLoveJava 726

我用 AI Agent 全自动跑 COMSOL 仿真:从建模到后处理,踩了 10+ 个深坑

本文探讨了利用AI通过COMSOL Java API实现AI芯片液冷冷板全流程自动化仿真的实践。针对700W高功耗AI芯片的散热需求,构建了包含4颗Chiplet和微通道冷板的三维液冷模型。通过严格设计的Prompt工程,AI Agent成功完成了从几何建模到结果验证的全过程,最终实现了芯片最高温度54°C的良好散热效果。文章重点分享了10个关键问题的解决经验,包括流体连通性验证、网格顺序控制、离散阶数选择、收敛判据优化等,并建立了包含流场/热场/网格独立性的三重验证体系。实践表明,AI可高效处理重复性工作

sjjsjjsjjsjjsjj的博客 995

[JVM]类加载的过程(学习总结)

我们所写的代码就相当于:一组 *.java 文件 + 一组资源文件(多么媒体文件、配置文件)+ 相关存储中的数据(MySQL、Redis...)我们现在的,要让运行时电脑运行我们的程序,实际就是让该电脑的CPU 运行我们程序中的指令数据。但CPU 无法直接和硬盘(IO设备)做直接的数据交换CPU 只能和内存中的数据打交道,现在数据又放在硬盘中所以我们应该先把数据从硬盘中读取到内存中。这个过程是(某个*.class 文件)进行读取的一次一个类文件的加载,按需进行加载(用到哪个加载哪个)...

weixin_61567666的博客 424

数字IC后端实现之快速获取innovus中drv violation的所有net list

数字IC后端设计实现之快速获取innovus中drv violation的所有net list

weixin_37584728的博客 3350

单卡调试OpenGait:从分布式到本地的轻量级改造指南

本文为个人开发者和研究者提供了一份详细的OpenGait框架单卡调试指南。针对该框架默认依赖多GPU分布式训练的问题,文章通过分析核心痛点,逐步讲解了如何从环境搭建、绕过分布式初始化陷阱、处理通信后端报错到最终配置与调试,实现从分布式到本地的轻量级改造,帮助读者在单张GPU上高效进行步态识别模型的验证与学习。

weixin_28223453的博客 141

JVM(2)类加载机制

类加载机制分为五个部分:加载、验证、准备、解析、初始化,下面我们来看这五个过程 加载 加载是类加载过程中的一个阶段,将class文件加载在内存中,并将静态数据结构(数据存在于class文件的结构)转化成方法区中运行时的数据结构,这个阶段会在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的入口。注意,这里不一定要从一个Class文件获取,这里既可以从...

qq_35821689的博客 275

ABAP BDC 处理踩坑笔记:把错误挡在录制之前,把稳定做进每一行 BDCDATA

本文总结了SAP BDC(批输入)开发中的常见问题和解决方案。重点包括:1)理解BDCDATA本质是模拟人工操作而非直接操作数据库;2)数据格式化技巧,如金额、日期、物料号等字段的标准化处理;3)通过CTU_PARAMS参数控制执行环境,确保屏幕尺寸和更新模式一致;4)不要依赖sy-subrc,应通过解析MESSTAB消息判断业务是否成功;5)录制阶段的常见陷阱及解决方法;6)疑难问题的系统性解决思路;7)建议建立完善的错误处理机制,包括日志记录和重跑功能。文章提供了实用的ABAP代码示例和配置建议,帮助开

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 268

JVM中的类加载问题

进行数据流和控制流分析,确定程序语义是合法的,符合逻辑的,对类的方法进行校验分析保证被校验的类的方法在运行时不会做出危害虚拟机安全的行为,获取类的二进制字节流的节点是我们Java程序员最关注的阶段,也是操控性最强的阶段,因为这个阶段我们可以对我们的类加载器进行操作,比如我们想自定义类加载器进行操作用以完成加载,又或者我们想通过JAVA Agent来完成我们的字节码增强操作;2.SPI机制 Service Provider Interface。

weixin_48031310的博客 214

YOLO26核心模块解析:SimSPPF轻量化空间金字塔池化的原理与优势详解

SimConv作为现代深度学习的基础构建块,其设计虽然简洁,但包含了多项关键技术的有机组合。通过将卷积、批量归一化和激活函数整合为统一模块,SimConv不仅提供了稳定的训练特性和良好的表达能力,还为后续更复杂网络架构的发展奠定了基础。SimConv的成功在于其体现了深度学习设计的核心理念:简洁性与有效性的平衡。它证明了通过合理的技术组合,可以在不显著增加复杂度的前提下大幅提升模型性能。随着深度学习技术的持续发展,SimConv及其变种将继续作为重要的基础组件,推动计算机视觉和人工智能技术的进步。

know_F0727的博客 2619

18、未来医疗信息学中的太赫兹天线技术

本文探讨了太赫兹天线技术在医疗信息学中的关键作用,重点分析了分裂环谐振器和纳米结构光导天线(PCA)的设计与性能提升方法,介绍了相干与非相干太赫兹检测技术,并通过等效电路模型和数值模拟深入解析PCA工作机理。文章还展示了太赫兹技术在无创血糖监测、肿瘤检测等医疗诊断中的实验应用,总结了其非侵入性、高分辨率成像和多参数分析等优势,同时指出信号检测难、成本高和技术复杂等挑战。未来趋势包括设备小型化、效率提升及与人工智能融合,拓展至药物研发、皮肤与神经疾病诊断等领域,展现出变革医疗健康的巨大潜力。

milk8的博客 146

JVM(类的加载)

JVM 类加载机制分为五个部分:加载,验证,准备,解析,初始化 1、加载:把class二进制文件加载到内存后,将类中定义的静态变量、 常量、类信息等数据存放到方法区的运行时数据结构,并在堆内存中创建 一个代表这个类的Class对象,作为方法区中这个类的数据信息的访问入口 。注意这里不一定非得要从一个 Class 文件获取,这里既可以从 ZIP包中 读取(比如从 jar 包和 war 包中读取),也可通过网络加载class文件,或 把一个Java源文件动态编译,并执行加载。 类的...

乌昂先生的博客 506

5ZCM6ZGrVDllSFLkv6Hmga/ljJbnrqHnkIbns7vnu58= GetFlowDropDown SQL注入

5ZCM6ZGrVDllSFLkv6Hmga/ljJbnrqHnkIbns7vnu58=、eHR/OA一体化智慧云平台、智慧一卡通云平台、行业软件开发与定制、智慧企业管理信息化咨询与项目服务为核心业务的顾问式管理咨询和软件个性定制开发的高科技股份集团公司。同鑫T9eHR信息华管理系统存在SQL注入漏洞,攻击者可通过该漏洞上传shell。关闭互联网暴露面或接口设置访问权限。利用sqlmap进行shell。

iSee857的博客 703

Java虚拟机(JVM)的动态类加载(Class Loading)(转)

1.介绍 Class Loaders是动态加载Java类与Resource的一种机制。它支持Laziness,type-safe linkage,user-defined extensibility和multiple communicating namespaces这4种特性。 l Lazy loading:Class只有在需要的时候才加载。...

agan007 119

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

JVM之加载class文件

一个java程序的执行,首先经历编译阶段由.java文件编译为16进制class文件并存放在磁盘或IO设备中,然后JVM可以适用于各个操作系统,将class文件编译为CPU可以运行的二进制文件。JVM首先会经过类加载器,将类名接口名、静态变量、常量等进行初始化并加载到内存中用二进制表示,存储在运行时数据区的方法区中,java代码中的实例对象,全局变量,字符串常量等存储在堆栈中,线程共享;

still_five_Days的博客 1697

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

【JavaSE】十九、JVM运行流程 && 类加载Class Loading

JVM内存分为五大区域: 程序计数器:线程私有,存储下条指令地址 虚拟机栈:线程私有,存储方法调用栈帧 本地方法栈:线程私有,支持Native方法调用 堆:线程共享,存储对象实例,GC主要区域 方法区:线程共享,存储类元信息(Java8后改为元空间) JVM运行流程: 类加载:加载→验证→准备→解析→初始化 执行引擎:解释执行与JIT编译结合 内存管理:运行时数据区维护程序状态 本地接口:支持JNI调用 垃圾回收:自动管理堆内存 类加载过程严格遵循五阶段顺序,确保类安全正确地加

lirendada的博客 1786

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

java 虚拟机浅析(二)JVM是怎么加载class文件的

前言 这篇文章已经介绍过JVM是跟class类型的文件发生交互的。 本篇文章就要介绍JVM是如何将硬盘中的class文件加载到内存中的。

asd13518662的博客 306

JVM系列【3】Class文件加载过程

JVM系列笔记目录 虚拟机的基础概念 class文件结构 class文件加载过程 jvm内存模型 JVM常用指令 GC与调优 Class文件加载过程 JVM加载Class文件主要分3个过程:Loading 、Linking、Initialzing 1.Loading Loading的过程就是通过类加载器将.class文件加载到jvm内存中过程。需要理解双亲委派机制、类加载器ClassLoader,加载过程如下。 ClassLoader 不同的类加载器加载范围不一样,以Java8中的为例。 B

qq_21579619的博客 798

JVM——类加载(Class Loading)

Java虚拟机中的类的加载可分为加载、验证、准备、解析、初始化五个过程,下面对这几个过程进行详细分析。                             加载       此过程中虚拟机需要完成以下3件事:      1)通过一个类的全限定明来获取定义此类的二进制字节流;      2)将这个字节流所代表的静态结构转化为方法区的运行时数据结构;      3)在内存中生成一个代表这个类的ja...

qq_39682377的博客 782

JVM笔记02.Class Loading

本文主要基于周志明老师的《深入理解Java虚拟机》及部分网络资源。 类加载 Class Loading 在Java代码中,类型(Class)的加载、连接与初始化过程都是在程序运行期间完成的。 类的生命周期 Class Cycle 加载 loading 查找并加载类的二进制数据 连接 linking 验证 verification 确保被加载的类的正确性 准备 preparation 为类的静态变量分配内存,并将其初始化为默认值(不是初值!!!) 解析 resolution 把类中.

努力推石头的西西弗斯 626

019-JVM-类的加载过程

前一篇:018-JVM-class文件的形象表示https://yuhongliang.blog.youkuaiyun.com/article/details/111499146 1.类加载子系统 类加载子系统负责从文件系统或者网络中加载class文件到运行时数据区。 ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine决定。 加载的类信息存放在一块成为方法区的内存空间中。 2.类加载器ClassLoader角色 Class file 存在于本地硬盘上,是

前路无畏的博客 1万+

Class加载-初始化-Loading

详解Class加载-初始化-Loading 类被加载到虚拟机内存中开始,到卸载出内存为止,整个生命周期包括7个阶段: 加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Usting)、卸载(Unloading) 加载Loading 通过一个类的全限定名来获取类的二进制字节流 并未...

重露成涓滴 544

bat 调用class文件_JVM系列「3」Class文件加载过程

JVM系列笔记目录虚拟机的基础概念class文件结构class文件加载过程jvm内存模型JVM常用指令GC与调优Class文件加载过程JVM加载Class文件主要分3个过程:Loading 、Linking、Initialzing1.LoadingLoading的过程就是通过类加载器将.class文件加载到jvm内存中过程。需要理解双亲委派机制、类加载器ClassLoader,加载过程如下。Cla...

weixin_39632467的博客 108

Class Loading -- 04 -- JVM类加载机制(三、类加载器)

接着我们再来详细地了解下虚拟机中的类加载器 一、类与类加载器 对于任意一个类,都需要由加载它的类加载器和这个类本身以通确立其在 Java 虚拟机中的唯一性 每一个类加载器,都拥有一个独立的类名称空间,通俗地讲:即比较两个类是否 “相等”,只有在这两个类是由同一个类加载器加载的前提下才有意义,不然即使这两个类来源于同一个 Class 文件,被同一个虚拟机加载,但只要加载它们的类加载器不同...

半日橙 248
上一篇: Web 框架Aranea 1.0 RC1 发布
下一篇: UML建模工具SDE for Eclipse 3.3 SP2 发布
java169
博客等级 码龄19年 27粉丝 2568原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值