当前位置: 首页 > news >正文

机场建设相关网站接推广app任务的平台

机场建设相关网站,接推广app任务的平台,网站运作模式,一句话进入wordpress目录 一、类加载生命周期 二、主动引用 2.1、创建类的实例 2.2、访问类的静态字段或静态方法 2.3、反射 2.4、初始化类的子类时,先初始化父类 2.5、虚拟机启动时,初始化 main 方法所在的类 2.6、动态语言支持 三、被动引用 3.1、通过子类引用父…

目录

一、类加载生命周期

二、主动引用

2.1、创建类的实例

2.2、访问类的静态字段或静态方法

2.3、反射

2.4、初始化类的子类时,先初始化父类

2.5、虚拟机启动时,初始化 main 方法所在的类

2.6、动态语言支持

三、被动引用

3.1、通过子类引用父类的静态字段

3.2、访问编译期常量

3.3、通过数组定义类引用


Java 虚拟机(JVM)中,类的加载并不是随意发生的,而是由特定的触发条件决定的。什么时候加载?什么时候初始化?

这是我们必须要搞清楚的问题,尤其在复杂的应用中,弄懂类加载的时机能帮助我们避免一些潜在的性能问题和运行时错误。

在本节中,我们将详细探讨类加载的时机、主动和被动引用的区别,以及常见的类加载触发条件。

一、类加载生命周期

类加载的生命周期包括:加载(Loading)链接(Linking)初始化(Initialization)。而其中,初始化阶段是决定类是否被真正加载的关键。

JVM 在什么时候启动类加载过程呢?

主要分为主动引用被动引用两种情况。我们分别看看这两种情况在什么条件下会触发类加载。

二、主动引用

主动引用是指程序显式地使用某个类,从而触发类的加载和初始化。根据《Java 虚拟机规范》,以下六种情况会触发类的主动引用,也就是触发类加载的条件!

2.1、创建类的实例

当你使用 new 关键字创建一个类的实例时,JVM 会立即加载并初始化该类。

// 触发 MyClass 的加载和初始化
MyClass obj = new MyClass(); 

初始化流程

  1. 分配内存给 MyClass 的实例对象。

  2. 加载 MyClass 类的字节码,并执行静态代码块和静态变量赋值操作。

2.2、访问类的静态字段或静态方法

访问类的静态字段或静态方法时,也会触发类的加载和初始化。

// 触发 MyClass 的加载
System.out.println(MyClass.staticVar);  
// 触发 MyClass 的加载
MyClass.staticMethod();                

常量不会触发类加载:如果静态字段是 final 修饰的常量,它在编译期已存入常量池,因此不会触发类加载。

System.out.println(MyClass.FINAL_CONSTANT);  // 不触发类加载

2.3、反射

通过反射调用类时,也会触发类加载。 

Class<?> clazz = Class.forName("com.example.MyClass");  // 触发 MyClass 的加载

2.4、初始化类的子类时,先初始化父类

当初始化一个类时,如果它的父类尚未初始化,JVM 会先初始化父类。

public class Parent {static {System.out.println("父类初始化");}
}public class Child extends Parent {static {System.out.println("子类初始化");}
}// 先输出"父类初始化",再输出"子类初始化"
Child obj = new Child();  

2.5、虚拟机启动时,初始化 main 方法所在的类

虚拟机启动时,main 方法所在的类是程序的入口类,会被优先加载和初始化。

public static void main(String[] args) {System.out.println("主类加载");
}

2.6、动态语言支持

在 Java 7 引入的 java.lang.invoke 包中,当 MethodHandle 最终指向的类需要初始化时,也会触发类的加载。

MethodHandle handle = MethodHandles.lookup().findStatic(MyClass.class, "staticMethod", MethodType.methodType(void.class));
handle.invoke();  // 可能触发 MyClass 的加载

三、被动引用

被动引用不触发类加载。

与主动引用相对,被动引用是指访问类的某些特性时不会触发类的加载和初始化。以下是几种典型的被动引用场景。

3.1、通过子类引用父类的静态字段

如果子类只引用父类的静态字段,JVM 只会初始化父类,而不会初始化子类。

示例

// 只触发 Parent 的加载,不触发 Child 的加载
System.out.println(Child.staticVar);  

3.2、访问编译期常量

访问 final 修饰的编译期常量,不会触发类的加载。

// 不触发 MyClass 的加载
System.out.println(MyClass.FINAL_CONSTANT);  

3.3、通过数组定义类引用

通过数组引用一个类,不会触发该类的加载。

// 不触发 MyClass 的加载
MyClass[] array = new MyClass[10];  

最后,为什么需要关注类加载的时机?

  • 避免类的过早加载:过早加载可能导致不必要的内存消耗,尤其在大型应用中。

  • 延迟加载(Lazy Loading):通过延迟加载,可以在真正需要时才加载类,减少启动时间。

  • 减少类加载冲突:在模块化或插件化的应用中,合理安排类加载顺序有助于避免类冲突和类加载死锁问题。

http://www.yayakq.cn/news/132586/

相关文章:

  • 龙信建设集团有限公司网站体验式营销
  • 建设科技信息+网站建设整合营销和链路营销
  • 公司核名在哪个网站做维修电器网站
  • 免费收录网站提交交互式网站设计怎么做
  • 4s店网站建设网络设计方案包括哪些方面
  • 简洁大气的网站首页两阳夹一阴后续走势
  • 网站运营频道内容建设网站问题seo解决方案
  • 网站建设淘宝好评做的好的音乐网站的特点
  • php网站后台源码大佬做的魔法少女网站
  • 浙江省住房和城乡建设厅干部学校网站公司部门英文缩写简称大全
  • 下载类网站如何做wordpress外贸数码
  • 网站建设运营与维护标准烟台seo管理
  • 廊坊app网站制作二手车辆交易网站如何做
  • 嘉兴网站建设搭建网站推广一般在哪个网做
  • 网站菜单模板电子商务网站建设的范围是什么意思
  • 网站建设与管理试卷及答案永久免费正版cad类软件
  • 营销型平台网站建设网站需要造价
  • 公司管理系统网站模板下载wordpress关键词标签
  • 优秀的定制网站建设公司江西省建设厅网站
  • 网站信息填写要求网站建设 部署与发布题库
  • 网站运营工作是干什么的机械加工怎样网上接单
  • 着力加强网站内容建设安庆网页设计培训
  • 手机网站 微信成都网站搭建优化推广
  • 益阳公司网站建设开公司核名的网址
  • 长沙建站公司哪有网站区域名是什么意思
  • 浙江建设工程招标网做网站排名优化的公司
  • 做任务换流量的网站电信网站备案查询
  • 手机网站服务器网站维护 北京
  • 江宁滨江网站建设网站商城建设合同范本
  • 怎么做钓鱼网站南宁网站建设公司排名