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

网站改版 需求文档门户网站需要多少费用

网站改版 需求文档,门户网站需要多少费用,软件工程系统设计案例,在哪里学做网站类加载生命周期与内存区域详解 Java 类加载的生命周期包括加载、验证、准备、解析、初始化五个阶段,每个阶段在内存中的存储区域和赋值机制各有不同。以下是详细解析: 一、类加载生命周期阶段 1. 加载(Loading) 内存区域&…

类加载生命周期与内存区域详解

Java 类加载的生命周期包括加载、验证、准备、解析、初始化五个阶段,每个阶段在内存中的存储区域和赋值机制各有不同。以下是详细解析:

一、类加载生命周期阶段

1. 加载(Loading)
  • 内存区域
    • 方法区:存储类的元数据(如类结构、字段、方法信息)
    • :生成对应的 java.lang.Class 对象
  • 赋值机制
    • 通过类加载器读取字节码文件(如 .class
    • 将字节码转换为方法区的二进制数据
    • 在堆中创建 Class 对象,作为方法区数据的访问入口
2. 验证(Verification)
  • 内存区域
    • 方法区:验证字节码的合法性
  • 赋值机制
    • 不涉及新的赋值,仅校验已加载数据的合规性
    • 例如:检查字节码格式、符号引用合法性、语义校验等
3. 准备(Preparation)
  • 内存区域
    • 方法区:为静态变量分配内存
  • 赋值机制
    • 为静态变量(static)分配内存并设置初始值
    • 初始值通常为数据类型的默认值(如 0nullfalse
    • 示例
      public static int value = 123; // 准备阶段赋值为 0,初始化阶段才赋值为 123
      
4. 解析(Resolution)
  • 内存区域
    • 方法区:将符号引用转换为直接引用
  • 赋值机制
    • 修改方法区中的符号引用,替换为直接引用(如内存地址、方法表索引)
    • 例如:将 com.example.MyClass 符号引用转换为对应的 Class 对象指针
5. 初始化(Initialization)
  • 内存区域
    • 方法区:执行类构造器 <clinit>()
    • 堆/栈:根据初始化逻辑为静态变量赋实际值
  • 赋值机制
    • 执行静态变量的显式赋值语句和静态代码块
    • 调用类构造器 <clinit>() 方法
    • 示例
      public static int value = 123; // 初始化阶段赋值为 123
      public static final int CONST = 456; // 编译期常量,准备阶段直接赋值为 456
      

二、各阶段内存分配与赋值示例

1. 代码示例
public class ClassLoadingExample {// 静态变量(准备阶段赋默认值 0,初始化阶段赋实际值 100)public static int staticVar = 100;// 静态常量(编译期常量,准备阶段直接赋实际值 200)public static final int CONSTANT = 200;// 静态代码块(初始化阶段执行)static {System.out.println("静态代码块执行");}// 实例变量(在对象创建时分配到堆中)private int instanceVar = 300;
}
2. 内存分配时序
阶段内存区域变量状态
加载方法区(元数据)
堆(Class 对象)
类结构信息被加载
ClassLoadingExample.class 对象创建
准备方法区staticVar = 0
CONSTANT = 200(编译期常量直接赋值)
初始化方法区(执行 <clinit>()staticVar = 100
静态代码块执行
实例化堆(对象实例)instanceVar = 300(每次创建对象时分配)

三、特殊情况说明

1. 静态常量(static final
  • 编译期常量:在编译时确定值,准备阶段直接赋实际值
    public static final int CONST = 123; // 准备阶段直接赋值为 123
    
  • 运行时常量:在运行时确定值,初始化阶段赋值
    public static final int RUNTIME_CONST = new Random().nextInt(); // 初始化阶段赋值
    
2. 类构造器 <clinit>()
  • 由编译器自动收集静态变量赋值语句和静态代码块生成
  • 线程安全,JVM 保证只执行一次
  • 示例
    static {a = 1; // 先赋值b = 2; // 后赋值
    }
    static int a;
    static int b;
    
    编译后的 <clinit>() 顺序:
    a = 1;
    b = 2;
    a = 0; // 变量定义覆盖赋值,最终 a=0, b=2
    

四、内存区域详细说明

1. 方法区(Method Area)
  • 存储内容
    • 类的结构信息(如字段、方法、接口定义)
    • 运行时常量池(包含符号引用和直接引用)
    • 静态变量
    • 类的字节码
  • JDK 8+ 变化
    • 方法区由 元空间(Metaspace) 实现,使用本地内存而非堆内存
2. 堆(Heap)
  • 存储内容
    • 类的实例对象(如 new ClassLoadingExample()
    • 数组
    • Class 对象(作为方法区元数据的访问入口)
  • 特点
    • 线程共享
    • 垃圾回收的主要区域
3. 栈(Stack)
  • 存储内容
    • 局部变量
    • 方法调用帧(包含方法参数、返回值等)
  • 与类加载的关系
    • 方法调用时会创建栈帧
    • 局部变量在栈帧中分配内存

五、总结

阶段内存区域核心操作示例赋值
加载方法区、堆读取字节码,创建 Class 对象
验证方法区校验字节码合法性
准备方法区为静态变量分配内存,赋默认值static int a;a = 0
解析方法区将符号引用转换为直接引用修改常量池中的引用类型
初始化方法区、堆/栈执行 <clinit>(),赋实际值static int a = 123;a = 123

理解类加载生命周期和内存分配机制,有助于深入掌握 Java 的运行原理,避免因静态变量初始化顺序等问题导致的错误。

http://www.dtcms.com/wzjs/582716.html

相关文章:

  • 做原创的网站wordpress升级方法
  • 国外字体设计网站徐州注册公司
  • 网络技术专业学什么合肥seo网站排名
  • 个旧市建设网站网站主页模板
  • 宜兴建设局拍卖房产的网站织梦 网站地图 样式
  • 常德做网站专业公司哪家好怎么创建免费的网站
  • 有了网站开发app是不是更容易网站死链检查
  • 网站域名注册需要什么手续深圳专业seo优化公司
  • 怎做不下网站刷枪wordpress评论不显示头像
  • 德阳响应式网站建设中国建设银行蚌埠官方网站
  • 网站运营小白可以做吗软件推广赚钱一个30
  • 电子商务网站建设需要哪些工作品牌设计公司宣传文案
  • 沅江网站制作餐饮app定制
  • 帮人恶意点击网站教育局门户网站建设目的
  • 织梦品牌集团公司网站模板(精)汽车网站建设预算
  • 网站没有做301的后果是什么wordpress 极简 主题
  • 杭州 网站开发公司国外设计网站h开头
  • 金龙网站哪里建设的网站主机租用
  • 北京建设有限公司信源官方网站sns社交网站有哪些
  • 杭州网站制作公司排名求个网站你明白的 知乎
  • 最好的小型 网站开发系统成都需要网站制作
  • 做视频网站视频短片wordpress手机版刷新
  • 网站tkd优化网页设计与制作思政微课
  • 开个小网站要怎么做的基于 seajs 的高性能网站开发和优化实践_王保平(淘宝)
  • 企业网站推广优化微信商城在哪儿打开
  • 找兼职做网站建设万州网站推广
  • 百度网站优化软件宿迁市宿城区二手房最新消息
  • 非微信官方网页自己做的网站成功的网络营销事件有哪些
  • 自己做返利网站seo营销推广
  • 如何查到网站建设连云港专业网站制作