java类加载机制和类加载器
什么是类加载机制编译器将java源码编译为字节码后,虚拟机将字节码读入内存进行解析、运行的过程,称之为java虚拟机的类加载机制。类加载机制中,使用类加载器完成类的加载过程。类的生命周期在上文中详细描述过,这里不赘述。详见Java类加载过程详解
什么是类加载器?通过一个类全限定名称来获取其二进制文件(.class)流的工具,被称为类加载器(classloader)
类加载器的分类java支持如下四种类加载器
启动类/引导类加载器 Bootstrap ClassLoader 由C/C++实现,嵌套在JVM内部,java程序无法直接操作此类。通过它来加载java核心类库。如JAVA_HOME/jre/lib/rt.jar、resources.jar、sun.boot.class.path路径下的包,为jvm运行提供所需要的包。 它并非继承自java.lang.ClassLoader,没有父类加载器。它负责加载扩展类加载器和应用程序类加载器,并成为其父类加载器。 处于安全考虑,启动类只加载包名为java|javax|sun开头的类。
扩展类加载器 Extensi ...
java类的生命周期和加载过程
类的生命周期类从被加载到虚拟机内存开始到卸载出内存为止,其生命周期包括如下七个部分:
加载 loading : 查找具有特定名称的类或者接口类型的二进制表示,并从该二进制表示创建类或者接口的过程。
链接: 下辖三个阶段: 验证、准备、解析,是获取类或者接口并将其组合到java虚拟机的运行时状态以便可以执行的过程。
验证 verification
准备 preparation
解析 resolution
初始化 initialization: 执行类或者接口的初始化方法。
使用 using
卸载 unloading
类加载时机java虚拟机没有规定类被加载的时机,但是确规定了类进行初始化的场景:对于初始化阶段,虚拟机规范中定义了如下6中情况,必须对类进行初始化:
当遇到 new、 getstatic、putstatic 或 invokestatic 这 4 条字节码指令时,比如 new 一个类,读取一个静态字段(未被 final 修饰)、或调用一个类的静态方法时。
当 jvm 执行 new 指令时会初始化类。即当程序创建一个类的实例对象。
当 jvm 执行 getstatic ...
JVM|入门
jvm运行时数据区jvm在执行java程序的过程中会把它所管理的内存划分为若干不同的数据区域。java虚拟机所管理的内存包括如下几个运行时数据区域:
1. 程序计数器程序计数器是一块娇小的内存空间,可以视作当前线程所执行的字节码的行号。字节码解释器工作时就是通过改变此值来选取下一条需要执行的字节码指令。多个线程中,每个线程都有一个独立的程序计数器,相互之间互不干扰,独立存储,线程私有。
2. java虚拟机栈java虚拟机栈是线程私有的,它的生命周期和线程相同。虚拟机栈描述的是java方法执行的线程内存模型,每个方法被执行的时候,java虚拟机栈都会同步创建一个栈帧用于存储局部变量表、操作数栈、动态连接、方法出口等。每个方法被调用、直至结束的过程对应该栈帧在虚拟机栈的入栈和出栈动作。
局部变量表中存放了编译期可知的各种java虚拟机基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference类型(指向对象起始地址的引用指针或指向代表对象位置的句柄)、和 returnAddress类型(指向字节码指令的地址))局 ...
springboot源码之启动流程3
引言
这个部分提出问题,引发思考
单例bean和原型bean的区别以及创建过程的差别?
上文springboot源码之启动流程2中几乎已经走完spring启动流程,但是遗留了两处逻辑
todo 回顾启动流程!
PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors
ServletWebServerApplicationContext#finishBeanFactoryInitialization
现在来看bean的创建流程:
ServletWebServerApplicationContext#finishBeanFactoryInitialization完成bean factory的上下文初始化,初始化所有非懒加载的单例。
12345678910111213141516171819202122232425262728293031323334/** * Finish the initialization of this context's bean factory, * initializ ...
spring之ioc
什么是ioc?IOC(inversion of control),就是控制反转的意思。何为控制反转?根据字⾯意思理解,就是对于某个东⻄A,原来的控制权在使⽤⽅B,B想⽤就能⽤,不想⽤就不⽤。现在把控制权交还给了A,只有A给了才能⽤,这样就是控制反转了。
123456789class A {}class B { // B需要将A的实例new出来,也就是我们说的控制 private A a = new A(); public void use() { System.out.print(a); }}
12345678910111213// A自行控制将自己作为bean注入ioc容器中@conponentclass A {}class B { // B根据需要从ioc容器中注入A, B 能注入A 的前提是A将自己暴露出去了 @Autowired private A a; public void use() { System.out.prin ...
springboot源码之启动流程2
spring启动流程比较长,接上回springboot源码之启动流程1,接下来继续看refreshContext
SpringApplication#refreshContext
创建并初始化 BeanFactory:首先,它会创建一个 BeanFactory 对象,用于管理和创建应用程序中的 Bean。
加载 Bean 定义:接下来,它会加载应用程序中定义的 Bean,包括通过注解、XML 配置文件等方式定义的 Bean。
实例化和初始化 Bean:然后,它会实例化和初始化所有的 Bean,包括依赖注入、AOP 代理等操作。
处理 Bean 生命周期回调:在 Bean 实例化和初始化完成后,refresh 方法会调用各个 Bean 的生命周期回调方法,例如 @PostConstruct 注解标注的方法。
注册 Bean 后置处理器:refresh 方法还会注册 Bean 后置处理器,用于在 Bean 初始化前后进行一些额外的处理操作。
通过调用 SpringApplication#refresh 方法,应用程序上下文将完成初始化和刷新,所有的 Bean 将被正确创建和配置,应用程序 ...
springboot源码之启动流程1
主程序入口
这里补充 入口 携带的注解说明
12345public class NotificationApp { public static void main(String[] args) { SpringApplication.run(NotificationApp.class, args); }}
构造方法12345678910org.springframework.boot.SpringApplicationpublic SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) { this.resourceLoader = resourceLoader; Assert.notNull(primarySources, "PrimarySources must not be null"); this.primarySources = new LinkedHashSet ...
java之springbean初始化
spring三级缓存引用1. spring三级缓存2. springbean装配过程3. Spring 的 InstantiationAware 后处理器4. 为什么JDK动态代理只能代理接口,不能直接代理类?CGlib为什么可以代理类?5. SpringBoot的启动流程
工作之工程术语
产品线沿用了华为的管理方案,一堆主管发邮件各种专有名词,根本看不懂,特此记录:RMT:需求管理团队RAT: 需求分析团队TSE:测试系统工程师DFX: Design forX(面向产品生命周期各环节的设计)的缩写
引用1. 解读华为研发6:需求管理组织2-RMT/RAT2. DFX项目管理及集成产品开发(IPD)模式
java之jprofile分析内存占用
有点舒服,假借内存分析之名学习一波java内存优化
引用1. java命令–jmap命令使用