为什么只有我的电脑看网站后台内容管理是乱码工业产品设计专业

张小明 2026/1/9 13:41:19
为什么只有我的电脑看网站后台内容管理是乱码,工业产品设计专业,织梦做的网站 首页有空白,内蒙古创意网站开发目录 一、类的生命周期 二、类加载过程 1、类加载过程的流程 2、各阶段详解 #xff08;1#xff09;加载#xff08;Loading#xff09;#xff1a;类加载的“入口”#xff0c;获取并存储类的二进制数据 主要任务#xff1a; #xff08;2#xff09;验证1加载Loading类加载的“入口”获取并存储类的二进制数据主要任务2验证Verification类加载的“安检”保证字节码的合法性1文件格式验证最基础2元数据验证语义检验3字节码验证最复杂4符号引用验证提前预判3 准备Preparation为类变量分配内存赋默认值注意实例代码对比4解析Resolution将符号引用转换为直接引用理解解析的内容何时解析5初始化Initialization执行用户的初始化逻辑1主动引用的场景2被动引用的场景不触发初始化初始化的执行顺序三、类卸载1、类卸载的条件1该类的所有实例对象都已被回收2加载该类的类加载器已被回收3该类的java.lang.Class对象没有被任何地方引用2、类卸载的范围3、类卸载的注意事项1避免持有Class对象的引用2GC 的不确定性3元空间的影响JDK 84接口和父类的卸载4、与实例回收的区别一、类的生命周期Java 中类的生命周期是指类从被加载到 JVM 中开始到最终被卸载出内存为止的整个过程。根据《Java 虚拟机规范》类的生命周期可分为7 个阶段其中加载、验证、准备、解析、初始化属于类加载阶段而使用和卸载是类加载后的运行时阶段。顺序如下加载Loading→ 验证Verification→ 准备Preparation→ 解析Resolution→ 初始化Initialization→ 使用Using→ 卸载Unloading其中加载、验证、准备、初始化、卸载是固定顺序执行的解析阶段可能在初始化之后执行为了支持动态绑定只有初始化阶段是主动触发的由 JVM 或用户代码触发其余阶段大多是被动触发的。二、类加载过程Java 的类加载过程是类生命周期中加载、验证、准备、解析、初始化这五个阶段的统称其中解析阶段可灵活调整时机是 JVM 将.class文件的二进制数据转化为内存中可执行类的核心流程。这个过程由类加载器和 JVM 协同完成每个阶段都有明确的职责和严格的执行规范。1、类加载过程的流程类加载过程遵循固定的执行顺序解析阶段可延迟整体流程如下加载Loading→ 验证Verification→ 准备Preparation→ 解析Resolution→ 初始化Initialization核心特征前四个阶段加载 - 解析主要由 JVM 自动完成初始化阶段是唯一执行用户代码静态代码块、类变量赋值的阶段解析的灵活性解析阶段可在初始化阶段之前静态绑定或之后动态绑定执行以支持 Java 的多态特性。2、各阶段详解1加载Loading类加载的“入口”获取并存储类的二进制数据这是类加载的第一个阶段由类加载器ClassLoader负责核心是将.class文件的二进制数据加载到 JVM 内存并创建Class对象。主要任务1获取类的二进制字节流JVM 不限制字节流的来源常见方式包括从本地文件系统加载如Hello.class最常见从 JAR/ZIP 包加载如rt.jar中的java.lang.String从网络加载如早期的 Applet 应用动态生成如 ASM、CGLIB 生成的字节码动态代理的代理类从数据库、缓存等其他数据源加载。2将字节流转换为方法区的运行时数据结构JVM 会按照.class文件的结构规范将字节流中的常量池、类信息、方法表、字段表等数据存储到方法区JDK 8 及以后为元空间MetaspaceJDK 7 及以前为永久代。3在堆中创建java.lang.Class对象这个对象是类的元数据访问入口包含了类的全限定名、方法、字段等信息后续通过反射操作类时本质就是操作这个Class对象。注意Class对象是单例的同一个类在 JVM 中只有一个Class对象由类加载器保证其唯一性。核心靠类加载器实现类加载器有很多种具体使用哪种类加载器是由双亲委托模型决定的。JVM 提供了三层内置类加载器还有用户自定义的类加载器类加载器类型负责加载的类实现语言父类加载器启动类加载器BootstrapJRE/lib/rt.jar 等核心类库如 java.lang.*C无根加载器扩展类加载器ExtensionJRE/lib/ext 目录下的扩展类Java启动类加载器应用程序类加载器Application类路径ClassPath下的用户自定义类Java扩展类加载器自定义类加载器自定义路径的类如热部署、加密类Java应用程序类加载器2验证Verification类加载的“安检”保证字节码的合法性这是类加载的安全屏障JVM 会对加载的字节码进行多维度校验防止恶意或非法的字节码破坏 JVM 的运行安全。若校验失败会直接抛出ClassFormatError、VerifyError等异常。验证阶段由四个校验环节组成1文件格式验证最基础校验.class文件的二进制格式是否符合 JVM 规范包括魔数是否为0xCAFEBABE主版本号是否在 JVM 支持的范围内字节码的结构是否完整如常量池的索引是否有效。2元数据验证语义检验校验类的元数据是否符合 Java 语言的语法规范包括类是否继承了final类若继承则非法类是否实现了接口的所有抽象方法字段、方法的签名是否合法如方法参数类型是否有效。3字节码验证最复杂校验字节码指令的执行逻辑是否合法防止运行时出现内存越界、栈溢出等问题包括操作数栈的栈深度是否平衡如压入两个数后必须执行弹出操作是否访问了越界的局部变量表指令的跳转是否指向合法的代码行。4符号引用验证提前预判校验常量池中的符号引用是否能被解析为有效的目标包括引用的类、方法、字段是否存在访问权限是否合法如是否试图访问私有方法。文件格式验证是基于类的二进制字节流进行的主要是保证输入的字节流能正确的解析并存储于方法去之内在格式上符合描述一个Java类型信息的要求。后面三个校验阶段都是基于方法区的存储结构上进行的不会再直接读取、操作字节流。符号引用验证是发生在类加载过程中的解析阶段即JVM将符号引用直接转化为直接引用的时候目的是为了保证解析阶段正常执行。开发环境中可通过-Xverify:none参数关闭验证阶段提升类加载速度生产环境禁止使用会带来安全风险。但是-Xverify:none和-noverify在JDK13被标记为了deprecated在未来的JDK版本中可能会被移除。3 准备Preparation为类变量分配内存赋默认值该阶段在方法区中为类的静态变量类变量分配内存并设置默认初始值零值是 JVM 自动完成的内存初始化步骤。注意仅处理静态变量实例变量的内存分配在对象实例化时JDK7之前在永久代中JDK7以后在堆中进行与该阶段无关。默认值为数据类型的零值数据类型默认零值数据类型默认零值int0booleanfalselong0Lchar\u0000float0.0f引用类型nulldouble0.0dbyte/short0static final常量的特殊处理若静态变量被final修饰如public static final int NUM 10;则在准备阶段直接赋值为代码中定义的常量值而非零值。原因是static final常量的值在编译期已确定存储在.class文件的ConstantValue属性中准备阶段直接从该属性取值赋值。实例代码对比public class Test { public static int a 10; // 准备阶段赋值为0初始化阶段赋值为10 public static final int b 20; // 准备阶段直接赋值为20 }4解析Resolution将符号引用转换为直接引用该阶段将方法区中常量池的符号引用字符串形式的引用转换为直接引用内存地址、偏移量等是 JVM 实现动态链接的关键。理解符号引用以字符串形式表示的引用如java/lang/System.out、java/io/PrintStream.println与具体内存地址无关。直接引用指向内存中实际对象的指针、偏移量或句柄与 JVM 的内存布局相关。解析的内容类 / 接口解析将类名的符号引用转换为对应的Class对象字段解析将字段名的符号引用转换为指向字段的直接引用方法解析将方法名的符号引用转换为指向方法的直接引用接口方法解析将接口方法的符号引用转换为指向接口方法的直接引用。何时解析静态解析在解析阶段完成适用于静态绑定的方法如static方法、final方法、私有方法这些方法的调用目标在编译期即可确定动态解析延迟到运行时完成适用于动态绑定的方法如实例方法为了支持多态调用目标需在运行时根据对象的实际类型确定。5初始化Initialization执行用户的初始化逻辑这是类加载过程中唯一执行用户代码的阶段是执行初始化方法clinit()方法的过程clinit()方法是由静态代码块static {}和静态变量的赋值语句合并得到的完成类的最终初始化。clinit()方法方法是编译之后自动生成的。对于clinit()方法的调用虚拟机会确保自己在多线程环境的安全性。因为clinit()方法有线程安全锁在多线程环境进行初始化可能引起多个线程阻塞且这种阻塞很难被发现。初始化的触发条件主动引用必须触发JVM 严格规定只有发生主动引用时才会触发类的初始化被动引用不会触发初始化。1主动引用的场景创建类的实例如new Test()调用类的静态方法如Test.staticMethod()访问类的非final静态变量如System.out.println(Test.a)反射调用类的方法如Class.forName(com.example.Test)初始化子类时父类会先被初始化递归到java.lang.ObjectJVM 启动时的主类包含main方法的类必然被初始化。2被动引用的场景不触发初始化访问类的static final常量常量在编译期已存入常量池无需初始化类通过子类访问父类的静态变量仅初始化父类子类不初始化创建类的数组如Test[] arr new Test[10]仅创建数组对象不初始化Test类。初始化的执行顺序父类优先先初始化父类递归向上直到java.lang.Object顺序执行按代码定义的顺序执行静态变量赋值语句和静态代码块多个静态代码块按定义顺序执行。代码示例public class Parent { public static int parent 10; static { System.out.println(Parent 静态代码块); } } public class Child extends Parent { public static int child 20; static { System.out.println(Child 静态代码块); } public static void main(String[] args) { System.out.println(Child.child); } }运行结果如下启动main方法触发Child类的初始化先初始化父类Parent再执行Child的静态代码和变量赋值。三、类卸载在 Java 中类卸载是类生命周期的最后一个阶段指 JVM 将类的元数据从方法区元空间JDK 8中移除同时回收堆中对应的java.lang.Class对象释放类占用的内存资源。类卸载的条件非常严格这也是为什么我们通常感觉 “类似乎不会被回收” 的原因。1、类卸载的条件JVM 规范明确规定只有满足以下三个条件时类才可能被卸载三者缺一不可1该类的所有实例对象都已被回收堆中不存在该类的任何实例包括正常实例、数组实例等实例对象的内存已被 GC 回收。2加载该类的类加载器已被回收类加载器的实例本身也是一个 Java 对象若它没有被任何地方引用如自定义类加载器的实例被 GC 回收则其加载的类才有卸载的可能。注意JVM内置的类加载器启动类加载器、扩展类加载器、应用程序类加载器始终存在于 JVM 的生命周期中永远不会被回收。3该类的java.lang.Class对象没有被任何地方引用堆中的Class对象是类元数据的访问入口若它被反射、静态变量、集合等引用持有则类无法被卸载。2、类卸载的范围类卸载的条件决定了其仅适用于自定义类加载器加载的类而JVM 内置类加载器加载的核心类库如java.lang.String、java.util.ArrayList永远不会被卸载。类加载器类型加载的类是否可被卸载原因启动类加载器否加载核心类库类加载器本身由 C 实现常驻 JVM 内存Class对象被永久引用扩展类加载器否JVM 启动后始终存在其加载的类的Class对象被系统持有应用程序类加载器基本否加载应用程序的核心类通常随应用进程存活类加载器不会被回收自定义类加载器是满足三个条件时类加载器和其加载的类均可被回收3、类卸载的注意事项1避免持有Class对象的引用若代码中通过static变量、集合、反射缓存等方式持有Class对象的引用即使满足其他条件类也无法被卸载。如// 该静态变量持有Class对象导致类无法卸载 public static Class? cacheClass;2GC 的不确定性JVM 的 GC 是自动触发的调用System.gc()仅为建议不保证立即执行。因此类卸载可能存在延迟需多次 GC 验证。3元空间的影响JDK 8JDK 8 将方法区替换为元空间Metaspace元空间使用本地内存而非堆内存类的元数据存储在元空间中。类卸载时元空间中的类元数据也会被释放避免了永久代的内存溢出问题。4接口和父类的卸载类卸载时其实现的接口和父类不会被自动卸载除非接口 / 父类也满足类卸载的三个条件。4、与实例回收的区别特征实例回收类卸载回收对象堆中的实例对象方法区的类元数据 堆中的Class对象触发条件实例无引用GC 时回收满足三个严格条件GC 时回收回收频率频繁发生极少发生仅自定义类加载器的类影响范围单个实例整个类所有实例已回收
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

建设网站能赚钱外贸公司网站案例

第一章:Open-AutoGLM页面加载缓慢的现状与挑战 Open-AutoGLM作为一款基于大语言模型的自动化网页生成工具,其核心功能依赖于动态资源加载与实时推理响应。然而,随着用户规模扩大和页面复杂度提升,系统频繁出现首屏渲染延迟、接口响…

张小明 2026/1/7 13:54:55 网站建设

有网站做点什么好设计工作网站

3步掌握PDFKit字体子集化:让PDF文件瘦身70%的终极指南 【免费下载链接】pdfkit 项目地址: https://gitcode.com/gh_mirrors/pdf/pdfkit 在现代文档处理中,PDF优化已成为提升用户体验的关键环节。字体子集化技术作为PDF文件瘦身的核心手段&#x…

张小明 2026/1/7 8:03:16 网站建设

4a景区网站建设标准网站设置5个关键词

C 结构体(struct)是用户自定义的数据类型,核心用于封装多个不同类型的数据成员,也支持成员函数和访问控制。核心特性默认访问权限为 public,结构体间可直接访问成员(类 class 默认 private)。能…

张小明 2026/1/9 6:28:17 网站建设

网站模板大全下载做框架模板的网站

5大理由选择mes:高性能任务调度系统终极指南 【免费下载链接】mes qcadoo MES - friendly web manufacturing software 项目地址: https://gitcode.com/gh_mirrors/me/mes 还在为复杂的任务调度而烦恼吗?当企业面临生产计划混乱、任务执行不及时、…

张小明 2026/1/9 6:23:24 网站建设

四川省建设领域信用系统网站贵阳市门户网站

1、演示视频 基于Java Swing的连连看小游戏2、项目截图 设计说明 3.1 整体架构设计 本项目采用单一主类LinkGame继承JFrame作为程序入口,内部包含多个私有方法和内部类,遵循“单一职责原则”将功能模块拆分: 界面初始化模块:in…

张小明 2026/1/8 1:22:38 网站建设

重庆重庆网站建设辽宁省住房和建设厅网站

企业云供应商解决方案深度剖析在当今数字化时代,云计算已成为企业发展中不可或缺的一部分。众多企业云供应商纷纷推出各自的解决方案,以满足不同企业的需求。本文将深入剖析惠普(HP)和甲骨文(Oracle)这两家…

张小明 2026/1/8 1:29:30 网站建设