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

网上花店 网站源代码icp ip 网站备案查询系统

网上花店 网站源代码,icp ip 网站备案查询系统,常州网站建设电话,wordpress jwplayerJVM的概念 JVM是Java Virtual Machine的缩写#xff0c; 即Java虚拟机#xff0c;也被称为Java程序运行的核心环境 。它是一种用于计算设备的规范#xff0c;‌通过在实际的计算机上仿真模拟各种计算机功能来实现。‌JVM由一套字节码指令集、‌一组寄存器、‌一个栈、‌一个…JVM的概念 JVM是Java Virtual Machine的缩写 即Java虚拟机也被称为Java程序运行的核心环境 。它是一种用于计算设备的规范‌通过在实际的计算机上仿真模拟各种计算机功能来实现。‌JVM由一套字节码指令集、‌一组寄存器、‌一个栈、‌一个垃圾回收堆和一个存储方法域等组成。‌它屏蔽了与操作系统平台相关的信息 使得Java程序只需生成在JVM上运行的目标代码 字节码 即可在多种平台上的JVM不加修改地运行。这是Java实现“一次编译 到处运行”的关键。JVM在执行字节码时 会将其解释成具体平台上的机器指令执行。 JVM的架构 JVM主要由以下几个部分组成 类加载器 类加载器的概念    类加载器是JVM的一个重要组成部分它实现了Java的动态加载特性。负责将Java类的字节码文件.class文件加载到位于内存的JVM中并转换为运行时数据结构为程序的执行做好准备。 类加载器的实质                                                                                           类加载器负责实现类的加载过程JVM是在内存中运行的。当Java程序被编译成字节码.class文件后这些字节码不会直接在物理硬件上执行而是被JVM加载到内存中并由JVM的解释器或即时编译器JIT Compiler转换为对应平台的机器码后执行。这个过程实现了Java的“一次编写到处运行”的特性因为JVM为不同操作系统平台提供了统一的运行环境。 JVM的类加载机制 JVM的类加载机制是Java虚拟机JVM中一个非常核心且复杂的部分它负责将类的字节码文件加载到内存中并初始化为JVM可以直接使用的数据结构。下面我将详细说明JVM的类加载机制主要分为几个关键阶段加载、验证、准备、解析和初始化。 1. 加载Loading 加载阶段是类加载机制的第一个阶段。在这一阶段JVM会查找并加载类的二进制数据通常是类的.class文件。这些文件可以通过不同的途径被获取如文件系统、网络、ZIP/JAR包等。加载完成后JVM会在内存中生成一个代表这个类的java.lang.Class对象这个对象作为类数据的访问入口。 2. 验证Verification 验证阶段的主要目的是确保加载的类信息是符合JVM规范的没有潜在的安全问题。验证过程包括文件格式验证、元数据验证、字节码验证和符号引用验证等步骤。通过这些验证JVM可以确保类文件的正确性和安全性。 3. 准备Preparation 准备阶段主要为类的静态变量分配内存并设置其初始值。这里的初始值是指数据类型的默认值如int的默认值是0boolean的默认值是false等。但需要注意的是这里设置的只是默认值而非用户代码中定义的初始值。用户定义的初始值将在初始化阶段被赋予。 4. 解析Resolution 解析阶段是将类、接口、字段和方法的符号引用转换为直接引用的过程。符号引用是一组符号用于描述所引用的目标而直接引用则是指向目标的指针、偏移量或句柄等。通过解析JVM可以确定每个符号引用的具体指向为后续的执行阶段做准备。 5. 初始化Initialization 初始化阶段是类加载机制的最后一个阶段。在这一阶段JVM会执行类的构造器clinit()方法这个方法是由编译器自动生成的用于初始化类的静态变量和执行静态代码块。需要注意的是clinit()方法只会被执行一次且多个线程同时访问时JVM会确保只有一个线程执行该方法。 6.类加载器Class Loaders JVM中还存在类加载器的概念它负责实现类的加载过程。Java中的类加载器采用了一种双亲委派模型Parents Delegation Model即当一个类加载器需要加载一个类时它首先会请求其父类加载器进行加载如果父类加载器无法加载则再由当前类加载器进行加载。这种模型有助于保证Java平台的安全性防止用户自定义的类替换掉Java核心类库中的类。 JVM类加载机制中的“双亲委派模型” 使用“双亲委派模型”的原因 在Java中类加载器Class Loader负责将类的字节码文件加载到JVM中并将其转换成JVM可以直接使用的数据结构。为了确保Java平台的安全性和类的唯一性Java采用了一种名为“双亲委派模型”的类加载机制。 “双亲委派模型”的概念 双亲委派模型的核心思想是当一个类加载器称为子加载器需要加载一个类时它首先不会尝试自己去加载这个类而是将这个加载请求委派给它的父加载器如果有的话去完成。每个类加载器都是如此只有当父加载器无法加载这个类时子加载器才会尝试自己去加载。 使用“双亲委派模型”的好处 安全性Java的核心类库如java.lang.*、java.util.*等是由启动类加载器Bootstrap ClassLoader加载的这些类在JVM启动时就被加载到内存中并且无法被用户自定义的类加载器所替换。这样可以防止恶意代码通过自定义类加载器来替换核心类库中的类从而破坏Java平台的安全性。 唯一性由于类加载器之间的委托关系Java中的每个类在JVM中都只会被加载一次并且与它的类加载器相关联。这样就保证了类的唯一性避免了因为类加载器的不同而导致相同全限定名的类被加载多次的问题。 沙箱安全机制双亲委派模型还可以配合Java的沙箱安全机制Sandbox Security Mechanism为不同的应用程序提供隔离的运行环境防止应用程序之间相互干扰。 注意双亲委派模型并不是强制性的用户可以通过自定义类加载器来打破这个模型但这需要谨慎操作以避免引入安全问题和类加载冲突。 “双亲委派模型”伪代码示例 假设我们有两个自定义的类加载器ChildClassLoader 和 ParentClassLoader其中 ChildClassLoader 是 ParentClassLoader 的子类。我们将模拟类加载过程并展示当 ChildClassLoader 尝试加载一个类时它是如何首先委派给 ParentClassLoader 的。 // 假设的ParentClassLoader类 class ParentClassLoader extends ClassLoader {Overridepublic Class? loadClass(String name) throws ClassNotFoundException {// 首先检查该类是否已经被加载Class? clazz findLoadedClass(name);if (clazz ! null) {return clazz;}// 尝试从父类加载器这里简化为系统类加载器加载try {clazz getParent().loadClass(name);return clazz;} catch (ClassNotFoundException e) {// 如果父类加载器加载不到再尝试自己加载}// 这里应该添加自己加载类的逻辑但为简化起见我们直接抛出异常throw new ClassNotFoundException(Class name not found.);} }// 假设的ChildClassLoader类 class ChildClassLoader extends ParentClassLoader {// 通常ChildClassLoader不需要重写loadClass方法// 因为它已经继承了ParentClassLoader的loadClass实现// 该实现已经遵循了双亲委派模型。// 但为了展示我们可以保持这个类为空或者添加一些特定的初始化逻辑。 }// 使用示例 public class ClassLoaderDemo {public static void main(String[] args) {// 创建ChildClassLoader实例ClassLoader childClassLoader new ChildClassLoader();try {// 尝试加载一个类比如java.lang.String// 注意在实际应用中不应该尝试加载Java核心库中的类// 这里只是为了演示双亲委派模型。Class? clazz childClassLoader.loadClass(java.lang.String);// 如果没有异常说明类被成功加载了。// 但实际上这个类是由启动类加载器Bootstrap ClassLoader加载的// 而不是由我们的ChildClassLoader或ParentClassLoader。// 这里只是为了说明双亲委派的过程。System.out.println(Class loaded successfully: clazz.getName());} catch (ClassNotFoundException e) {System.out.println(Class not found: e.getMessage());}} }// 注意上面的示例代码并不完全准确因为实际上java.lang.String是由启动类加载器加载的 // 它不是通过自定义的类加载器链来加载的。但这里只是为了演示双亲委派的概念。 在这个例子中ChildClassLoader 尝试加载 java.lang.String 类时它会首先将其加载请求委派给它的父加载器 ParentClassLoader而 ParentClassLoader 又会进一步将其委派给它的父加载器在这个简化的例子中我们假设它直接委派给了系统类加载器但在实际的JVM中它最终会委派给启动类加载器。由于 java.lang.String 是Java核心库中的类因此它会被启动类加载器加载而不是由我们的自定义类加载器加载。这个过程体现了双亲委派模型的工作原理。 运行时数据区 程序计数器 每个线程都有一个独立的程序计数器用于指示当前线程正在执行的字节码指令的地址。 Java虚拟机栈 每个线程在创建时都会创建一个虚拟机栈用于存储局部变量表、操作数栈、动态链接、方法出口等信息。 本地方法栈 与虚拟机栈类似但它是为执行本地方法如C语言编写的方法服务的。 Java堆 JVM中内存最大的一块被所有线程共享用于存放对象实例和数组。 方法区 在Java 8之前方法区包含运行时常量池用于存储类的结构信息、常量、静态变量等。Java 8之后方法区被元空间Metaspace所替代元空间使用本地内存而非JVM堆内存。 执行引擎 负责执行字节码指令包括解释执行和即时编译JIT两种方式。解释执行是指逐条解释字节码指令并执行而JIT编译则是将部分字节码编译成机器码以提高执行效率。 垃圾回收器 负责回收JVM中不再使用的对象释放内存空间。垃圾回收器是JVM的一个重要组成部分它采用多种算法来识别和回收垃圾对象。 JVM的工作原理 JVM的工作原理可以概括为以下几个步骤 代码编译Java源代码被编译成Java字节码这是JVM能够识别的指令集。 类加载JVM通过类加载器将字节码文件加载到内存中并转换为运行时数据结构。 字节码验证JVM对加载的字节码进行验证确保它符合JVM规范没有安全漏洞。 执行JVM的执行引擎负责执行字节码指令。根据JVM的实现可以选择解释执行或JIT编译执行。 内存管理JVM负责管理Java程序执行过程中所使用的内存包括堆、栈、方法区等。 垃圾回收JVM的垃圾回收器定时回收不再使用的对象释放内存空间。 常见JVM调优方法 堆内存调优 调整JVM的堆内存大小包括初始堆大小-Xms和最大堆大小-Xmx。合理的堆内存设置可以避免因内存不足导致的性能问题同时减少因内存过大造成的资源浪费。通过设置新生代Young Generation和老年代Old Generation的大小以及Eden区与 Survivor区的比例优化垃圾回收GC的效率和内存利用率。 垃圾回收GC调优 选择合适的垃圾回收器如Serial GC、Parallel GC、CMS GC或G1 GC。不同的垃圾回收器适用于不同的应用场景例如G1 GC适用于需要低延迟和可预测停顿时间的应用。调整垃圾回收器的相关参数如新生代大小、老年代大小、GC线程数等以优化垃圾回收的性能。 线程调优 合理设置线程池的大小避免创建过多的线程导致系统资源耗尽。调整线程栈的大小以适应应用程序的需求。线程栈过大可能导致内存浪费过小则可能导致栈溢出错误。 JIT编译器调优 通过调整JIT编译器的参数如编译阈值、内联策略等优化热点代码的执行效率。合理使用JIT编译器的优化技术如逃逸分析、标量替换等提高代码的执行速度。 类加载调优 优化类加载器的层次结构和加载策略减少类加载的次数和提高加载速度。使用自定义的类加载器来隔离不同的组件或库避免类冲突和内存泄漏。 I/O调优 使用合适的缓冲区大小和优化I/O操作方式如NIO减少I/O操作的次数和开销。对于高并发I/O操作考虑使用异步I/O或NIO的多路复用机制来提高性能。 监控和日志分析 使用JVM监控工具如JConsole、VisualVM、JProfiler等对应用程序进行实时监控分析内存使用、GC行为、线程状态等关键指标。启用GC日志记录并通过分析GC日志来识别性能瓶颈和优化点。 代码优化 优化Java代码减少不必要的对象创建和销毁降低垃圾回收的压力。使用合适的集合类型和算法提高代码的执行效率。避免在循环中创建大量对象或进行复杂的计算。 在Java代码中减少不必要的对象创建 重用对象 当对象可以被多次使用时考虑重用它们而不是每次都创建新的实例。例如在循环中可以将对象声明在循环外部并在循环内部重复使用。 使用对象池 对于创建成本较高的对象如数据库连接、线程等可以使用对象池来管理它们的生命周期。对象池可以减少对象的创建和销毁次数从而提高性能。 避免在方法中创建不必要的对象 在方法内部尽量避免创建仅在方法内部使用的临时对象特别是当这些对象可以在方法调用之间共享时。 使用字符串常量 对于字符串常量应该使用String的intern()方法或直接在代码中使用字符串字面量以便在JVM的字符串常量池中重用相同的字符串对象。 利用基本数据类型 当可以使用基本数据类型如int、double等时避免使用它们的包装类如Integer、Double等因为包装类的创建和拆箱操作会带来额外的性能开销。 优化集合的使用 在使用集合时根据实际需求选择合适的集合类型并合理设置集合的初始容量和加载因子以减少扩容时的对象创建。 避免在循环中创建对象 尽可能将循环中创建的对象移到循环外部如果对象必须在循环中创建考虑是否可以使用同一个对象并更新其状态。 使用不可变对象 不可变对象一旦被创建其状态就不能被改变因此它们可以被安全地共享而无需担心数据一致性问题。使用不可变对象可以减少对象的创建和复制次数。 利用缓存 对于计算结果或对象如果它们可以被缓存并在后续请求中重用那么使用缓存可以显著减少对象的创建和计算开销。 分析并优化热点代码 使用性能分析工具如JProfiler、VisualVM等来识别性能瓶颈和热点代码。针对这些热点代码进行优化减少不必要的对象创建和内存分配。 字节码执行流程 加载类文件 类装载器负责将Java类文件.class文件加载到JVM中。在这个过程中类装载器会验证类文件是否符合Java类文件格式规范。加载到JVM类文件被加载后JVM会为其创建一个Class对象并存储在方法区或元空间从JDK 8开始中。  字节码校验 字节码校验器对加载的类文件中的字节码进行校验确保代码中不包含非法操作如访问违规内存、执行不安全的系统调用等。这是JVM实现安全性的重要环节。 解释执行 解释器如果字节码通过了校验JVM的解释器会逐条解释执行字节码指令。解释器会将字节码转换为机器码然后交由底层操作系统执行。即时编译器为了提高执行效率JVM还包含了一个即时编译器。JIT编译器会在运行时将热点代码即频繁执行的代码编译成机器码以提高执行速度。 运行时数据区 在执行过程中JVM会利用运行时数据区来存储和管理程序运行时的数据即在执行过程中JVM的内存管理器负责分配和回收内存。 垃圾回收 当对象不再被引用时JVM的垃圾回收器会回收其占用的内存空间。 程序结束 当Java程序执行完毕或遇到异常终止时JVM会卸载已加载的类并释放所有资源。
http://www.dnsts.com.cn/news/78229.html

相关文章:

  • 淳化网站制作1 网站建设的目标是什么
  • 抖音代运营收费详细价格常州 网站优化
  • dw做的网站怎么发布深圳市工程建设网站
  • 沈阳企业建站系统模板iis7 网站访问权限
  • dw5做简单的企业网站网站开发人员岗位
  • 怎么在自己的网站做淘宝客交互式英语网站的构建
  • 技术支持 东莞网站建设 轴承8元一年虚拟云主机
  • 网页网站建设软件蓝海国际版网站建设
  • 广州购物网站公司地址营销型网站建设明细报价表
  • 公众号可以做自己网站的超链接crm网站推荐
  • 手机网站怎么做seowordpress如何设置目录
  • 网站编辑的栏目怎么做wordpress注册提示邮件发送失败
  • 武隆网站建设wordpress导入插件
  • wordpress 局域网 显示不全seo招聘网
  • 做网站设计的电脑需要什么配置网站百度排名怎么做
  • 青青网站怎么做同安建设局网站
  • 济南城乡住房建设厅网站网站建设简介淄博
  • 在手机上创建网站吗wordpress增加背景图片
  • 做网站找沈阳横纵网络东莞哪里有网站建设厂家
  • 电子商务成功网站的案例男科医院网站建设公司
  • 旅游酒店网站建设网站建设实施方案ppt
  • 金泉网做网站网站定位 怎么做
  • 网站开发目的和意义在手机上做网站
  • 搭建博客网站常州网站公司网站
  • 成都私人做网站天猫商城官网下载
  • 网站制作建设是做什么河南省 门户网站建设要求
  • 郑州汉狮做网站报价武安企业做网站推广
  • 在线推广企业网站的方法提供做网站服务好
  • 网站建设张景鹏幻灯片模板
  • 网站新闻页面设计手机个别网页打不开