Java 代码执行流程

类加载过程

加载 -> 验证 -> 准备 -> 解析 -> 初始化 -> 使用 -> 卸载

类加载时机:代码使用到这个类时

验证阶段

".class”加载到内存里之后,必须先验证一下,校验他必须完全符合JM规范,后续才能交给VM来运行。

准备阶段

给加载的类分配内存空间
给类变量(static 修饰)分配内存空间
给类变量赋默认初始值

解析阶段

实际上就是把符号引用替换为直接引用的过程

加载 -> 验证 -> 准备 -> 解析:分配类内存空间,分配类变量内存空间,类变量赋默认值。

初始化阶段

类初始化代码:

public class ReplicaManager {
public static int flushInterval = Configuration.getInt( "replica.flush.interval");
}

准备阶段会给变量分配内存空间和初始值 0

初始化阶段会执行代码 Configuration.getInt( "replica.flush.interval"); 读取配置并赋值。

类初始化的时机:

1.当创建某个类的新实例时(如通过new或者反射,克隆,反序列化等)

2.当调用某个类的静态方法时

3.当使用某个类的接口或静态字段时

4.调用Java API中的某些反射方法时,比如类Class中的方法,或者java.lang.reflect中的类的方法时

5.当初始化某个子类时

6.当虚拟机启动某个被标明为启动类的类

类加载器和双亲委派机制

启动类加载器
Bootstrap ClassLoader:负责加载 java 安装目录(lib)下的核心类
扩展类加载器
Extension ClassLoader:负责加载 java 安装目录(lib\ext)下的扩展类
应用程序类加载器
Application ClassLoader:负责加载 “ClassPath” 环境变量所指定的路径中的类,即写好的 java 代码
自定义类加载器
自定义的类加载器,根据自己需求加载类

双亲委派机制图解

类加载器加载类时不会尝试自己去加载,而是会去询问自己的上级类加载器能否加载这个类,

以此类推,直到顶级类加载器,父级加载器无法完成加载就会下推加载权力给子类加载器,

这就是所谓的双亲委派机制:先找父级加载,未找到就交给子级加载。优势:避免重复加载,防止核心库被篡改

Tomcat 类加载机制

对于任意一个类,都需要由加载它的类加载器和这个类本身一同确立其在Java虚拟机中的唯一性,

每—个类加载器,都拥有一个独立的类名称空间。

也就是说,判断2个类是否“相等”,只有在这2个类是由同一个类加载器加载的前提下才有意义,

否则即使这2个类来源于同一个Class文件,被同一个虚拟机加载,只要加载它们的类加载器不同,这2个类必定不相等。

基于双亲委派模型设计,那么Java中基础的类,类似Object类重复多次的问题就不会存在了,

因为经过层层传递,加载请求最终都会被Bootstrap ClassLoader所响应。

加载的Object类也会只有一个,否则如果用户自己编写了一个java.lang.0bject类,并把它放到了ClassPath中,

会出现很多个Object类,这样Java类型体系中最最基础的行为都无法保证,应用程序也将一片混乱

打破双亲委派机制则不仅要继承ClassLoader类,还要重写loadClass和findClass方法。

tomcat需要破坏双亲委派模型的原因:

(1)tomcat中的需要支持不同web应用依赖同一个第三方类库的不同版本,jar类库需要保证相互隔离;

(2)同一个第三方类库的相同版本在不同web应用可以共享

(3)tomcat自身依赖的类库需要与应用依赖的类库隔离

(4)jsp需要支持修改后不用重启tomcat即可生效 为了上面类加载隔离和类更新不用重启,定制开发各种的类加载器

Java 代码执行流程的更多相关文章

  1. 第一章 Java代码执行流程

    说明:本文主要参考自<分布式Java应用:基础与实践> 1.Java代码执行流程 第一步:*.java-->*.class(编译期) 第二步:从*.class文件将其中的内容加载到内 ...

  2. kbengine Unity3d demo 代码执行流程(4)

    当服务端成功启动,客户端链接服务端后进入demo中的游戏界面,demo中的功能包括注册.登录.角色管理.战斗.场景等等. 对于新接触kbengine的人,看见客户端的代码后会觉得很迷茫,有些无从下手. ...

  3. debian内核代码执行流程(三)

    接续<debian内核代码执行流程(二)>未完成部分 下面这行输出信息是启动udevd进程产生的输出信息: [ ]: starting version 175是udevd的版本号. 根据& ...

  4. debian内核代码执行流程(二)

    继续上一篇文章<debian内核代码执行流程(一)>未完成部分. acpi_bus_init调用acpi_initialize_objects,经过一系列复杂调用后输出下面信息: [ IN ...

  5. 【Hadoop离线基础总结】通过Java代码执行Shell命令

    通过Java代码执行Shell命令 需求 在实际工作中,总会有些时候需要我们通过java代码通过远程连接去linux服务器上面执行一些shell命令,包括一些集群的状态管理,执行任务,集群的可视化界面 ...

  6. Java中异常发生时代码执行流程

    异常与错误: 异常: 在Java中程序的错误主要是语法错误和语义错误,一个程序在编译和运行时出现的错误我们统一称之为异常,它是VM(虚拟机)通知你的一种方式,通过这种方式,VM让你知道,你(开发人员) ...

  7. Dalvik虚拟机java方法执行流程和Method结构体分析

    Method结构体是啥? 在Dalvik虚拟机内部,每个Java方法都有一个对应的Method结构体,虚拟机根据此结构体获取方法的所有信息. Method结构体是怎样定义的? 此结构体在不同的andr ...

  8. java控制执行流程

    控制执行流程 欢迎转载,转载烦请注明出处,谢谢. https://www.cnblogs.com/sx-wuyj/p/11177257.html java当中涉及到的关键字包括if-else.whil ...

  9. 当try-catch-finally代码块遇上return,代码执行流程是怎样

    这里打算用一个Java读取文件内容的例子来测试,文件存在,不抛异常,文件不存在,则抛出FileNotFoundException: Java读取文件代码如下: /** * 根据路径和文件名获取内容 * ...

随机推荐

  1. 关于spring cloud项目搭建问题

    spring cloud 是基于spring boot搭建,父项目中引入依赖时候一定要将spring boot和spring cloud 的版本号对应起来,要不然jar包报错,项目也启动不起来!!!下 ...

  2. 鸿蒙内核源码分析(ELF格式篇) | 应用程序入口并不是main | 百篇博客分析OpenHarmony源码 | v51.04

    百篇博客系列篇.本篇为: v51.xx 鸿蒙内核源码分析(ELF格式篇) | 应用程序入口并不是main | 51.c.h.o 加载运行相关篇为: v51.xx 鸿蒙内核源码分析(ELF格式篇) | ...

  3. 如何通过云效Flow完成自动化部署—主机部署

    如何通过云效Flow完成自动化部署-主机部署,云效流水线Flow是持续交付的载体,通过构建自动化.集成自动化.验证自动化.部署自动化,完成从开发到上线过程的持续交付.通过持续向团队提供及时反馈,让交付 ...

  4. ❤️Python接口自动化,一文告诉你连接各大【数据库】建议收藏❤️

    @ 目录 前言 常见数据库 Mysql Oracle sql-server PostgreSQL MongoDB Redis 前言 相信很多小伙伴在使用python进行自动化测试的时候,都会涉及到数据 ...

  5. VueCLI3 创建vue项目

    关于旧版本 Vue CLI 的包名称由 vue-cli 改成了 @vue/cli. 如果你已经全局安装了旧版本的 vue-cli (1.x 或 2.x),你需要先通过 npm uninstall vu ...

  6. GoLang设计模式08 - 命令模式

    命令模式是一种行为型模式.它建议将请求封装为一个独立的对象.在这个对象里包含请求相关的全部信息,因此可以将其独立执行. 在命令模式中有如下基础组件: Receiver:唯一包含业务逻辑的类,命令对象会 ...

  7. 踩坑系列《二》NewProxyResultSet.isClosed()Z is abstract 报错踩坑

    在运行测试类的时候莫名其妙的报了个 NewProxyResultSet.isClosed()Z is abstract 这个错误,之前出现过这个错误,以为是版本出现了问题 就将版本 0.9.1.2 改 ...

  8. MySQL8.0.20安装教程图文详解,MySQL8.0.20安装教程winodws10

    MySQL8.0.20安装教程图文详解,非常详细 一:mysql官网下载 https://dev.mysql.com/downloads/file/?id=494993 不用注册,直接下载就好 二:解 ...

  9. 前端规范之Git工作流规范(Husky + Comminilint + Lint-staged)

    代码规范是软件开发领域经久不衰的话题,几乎所有工程师在开发过程中都会遇到或思考过这一问题.而随着前端应用的大型化和复杂化,越来越多的前端团队也开始重视代码规范.同样,前段时间,笔者所在的团队也开展了一 ...

  10. 数据库MySQL主从-GTID

    1.第一步在主服务器上/etc/my.cnf/下添加 log-bin=log-bin server-id=1 gtid_mode=ON enforce_gtid_consistency 2.第二步:重 ...