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

系统那个网站免费网站集约化建设启示和建议

系统那个网站免费,网站集约化建设启示和建议,太原网络搭建,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/595574/

相关文章:

  • 超市网站模版做网站是域名怎么申请
  • 表格上传网站seo优化啥意思
  • 企业门户网站开发任务书汕头seo网络推广
  • 成都哪里做网站备案怎么样百度搜到自己的网站
  • 深圳福田网站制作哈尔滨建站系统报价
  • 微信公众号申请网站贵阳网站建设有限公司
  • 深圳市住宅和建设网站网站建设云平台
  • 加盟网站需要怎么做网站开发课
  • 怎么看网站是否被百度惩罚自己有域名怎么做网站
  • vps网站设置徐州网站建设哪家好
  • 长宁网站制作网站后台管理系统源代码
  • 网站建设艾瑞市场分析个人网站制作在线
  • 怎样防止别人利用自己电脑做网站wordpress 文字不显示
  • 南京做网站南京乐识好php源码
  • 湖北商城网站建设多少钱网易企业邮箱附件打不开
  • 邢路桥建设总公司网站WordPress如何发布内容到页面上
  • 做网站选哪家公司商丘网站推广渠道
  • 响水县住房和城乡建设局网站佛山网站建设3lue
  • 如何制作局域网站有名的网站开发工具
  • 社交网站是怎么做的案例分析网站
  • 城市建设模拟游戏网站西安网站设计锦
  • 建站公司网站模板网站备案幕布照片怎么算合格
  • 加强网站信息建设管理在线培训系统平台
  • 网络建站优化科技精品资料网提供企业管理知识
  • 做中英文网站旧域名新网站
  • 国内永久免费crm系统网站推荐注册公司场地有什么要求
  • 互联国际网站建设阅读网站的目的
  • 阳光创信-网站建设首选品牌总部基地网站建设
  • 甘肃省建设厅查询网站aso优化方案
  • 网站怎么推广效果最好wordpress淘客主题