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

php网站开发试题及答案网站维护与建设合同

php网站开发试题及答案,网站维护与建设合同,江苏建设教育网官网,简单广告牌制作方法前言 类装载器子系统是JVM中非常重要的部分#xff0c;是学习JVM绕不开的一关。 一般来说#xff0c;Java 类的虚拟机使用 Java 方式如下#xff1a; Java 源程序#xff08;.java 文件#xff09;在经过 Java 编译器编译之后就被转换成 Java 字节代码#xff08;.class …前言 类装载器子系统是JVM中非常重要的部分是学习JVM绕不开的一关。 一般来说Java 类的虚拟机使用 Java 方式如下 Java 源程序.java 文件在经过 Java 编译器编译之后就被转换成 Java 字节代码.class 文件。 类加载器负责读取 Java 字节代码并转换成 java.lang.Class类的一个实例。 每个这样的实例用来表示一个 Java 类。 通过此实例的 newInstance()方法就可以创建出该类的一个对象。 类的生命周期 我们先来看下类的生命周期包括 加载 连接 初始化 使用 卸载 其中加载、连接、初始化属于类加载过程。 使用是指我们new对象进行使用。 卸载指对象被GC垃圾回收掉。 类加载过程 JVM的类加载的过程是通过引导类加载器bootstrap class loader创建一个初始类initial class来完成的这个类是由JVM的具体实现指定的。 Class 文件需要加载到虚拟机中之后才能运行和使用系统加载 Class 类型的文件份如下几步 加载连接验证准备解析初始 顺序是这样一个顺序但是加载阶段和连接阶段的部分内容是交叉进行的加载阶段尚未结束连接阶段可能就已经开始了。 下面我们来逐步解析 加载 这里的加载是微观上的是类加载过程中的一小步也是第一步类加载过程中的加载是宏观上的。 加载的流程如下 通过全类名获取定义此类的二进制字节流 将字节流所代表的静态存储结构转换为方法区的运行时数据结构 在内存中生成一个代表该类的 Class 对象作为方法区这些数据的访问入口 简单来说就是加载二进制数据到内存 — 映射成JVM能识别的结构— 在内存中生成class文件。 在虚拟机规范上对这部分的规定并不具体所以实现方式是很灵活的。 加载阶段我们可以用自定义类加载器去控制字节流的获取方式是非数组类的可控性最强的阶段而数组类型不通过类加载器创建它由 Java 虚拟机直接创建。 关于类加载器是什么后文再聊。//加入Java开发交流君样756584822一起吹水聊天 连接 连接分为三步验证、准备、解析目的是将上面创建好的Class类合并至JVM中使之能够执行的过程。 验证 确保class文件中的字节流包含的信息符合当前虚拟机的要求保证这个被加载的class类的正确性不会危害到虚拟机的安全。 准备 为类中的静态字段分配内存并设置默认的初始值比如int类型初始值是0。 被final修饰的static字段不会设置因为final在编译的时候就分配了。 解析 解析阶段的目的是将常量池内的符号引用转换为直接引用的过程。 解析动作主要针对类、接口、字段、类方法、接口方法、方法类型等。 如果符号引用指向一个未被加载的类或者未被加载类的字段或方法那么解析将触发这个类的加载但未必触发这个类的链接以及初始化。 符号引用就是一组符号来描述目标可以是任何字面量。 直接引用就是直接指向目标的指针、相对偏移量或一个间接定位到目标的句柄。 举个例子 在程序执行方法时系统需要明确知道这个方法所在的位置。 Java 虚拟机为每个类都准备了一张方法表来存放类中所有的方法。 当需要调用一个类的方法的时候只要知道这个方法在方法表中的偏移量就可以直接调用该方法了。 通过解析操作符号引用就可以直接转变为目标方法在类中方法表的位置从而使得方法可以被调用。 所以解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程也就是得到类或者字段、方法在内存中的指针或者偏移量。 初始化 初始化就是执行类的构造器方法是类加载的最后一步这一步 JVM才开始真正执行类中定义的 Java 程序代码 这个方法不需要定义是javac编译器自动收集类中所有类变量的赋值动作和静态代码块中的语句合并来的。 若该类具有父类jvm会保证父类的init()先执行然后在执行子类的init()。 对于初始化阶段虚拟机严格规范了有且只有 5 种情况下必须对类进行初始化只有主动去使用类才会初始化类 当遇到 new 、getstatic、putstatic或invokestatic这 4 条直接码指令时 当遇到一个类读取一个静态字段(未被final修饰)、或调用一个类的静态方法时。 当 JVM执行new指令时会初始化类。即当程序创建一个类的实例对象。 当 JVM执行 getstatic指令时会初始化类。即程序访问类的静态变量(不是静态常量常量会被加载到运行时常量池)。 当 JVM执行 putstatic指令时会初始化类。即程序给类的静态变量赋值。 当 JVM执行invokestatic指令时会初始化类。即程序调用类的静态方法。 对类进行反射调用时如果类没初始化需要触发其初始化。 初始化一个类如果其父类还未初始化则先触发该父类的初始化。 当虚拟机启动时用户需要定义一个要执行的主类 (包含 main 方法的那个类)虚拟机会先初始化这个类。 MethodHandle 和 VarHandle 可以看作是轻量级的反射调用机制而要想使用这 2 个调用 就必须先使用 findStaticVarHandle 来初始化要调用的类。 「补充来自issue745」 当一个接口中定义了 JDK8 新加入的默认方法被 default 关键字修饰的接口方法时如果有这个接口的实现类发生了初始化那该接口要在其之前被初始化。 类加载器 三大类加载器 了解了类加载过程后我们来看看类加载器。 类加载器ClassLoader用来加载 Java 类到 Java 虚拟机中。 JVM 中内置了三个重要的 ClassLoader同时按如下顺序进行加载 BootstrapClassLoader启动类加载器最顶层的加载类由C实现负责加载 %JAVA_HOME%/lib目录下的核心jar包和类或者或被 -Xbootclasspath参数指定的路径中的所有类。ExtensionClassLoader扩展类加载器主要负责加载目录%JRE_HOME%/lib/ext目录下的jar包和类或被 java.ext.dirs 系统变量所指定的路径下的jar包。AppClassLoader 应用程序类加载器面向我们用户的加载器负责加载当前应用classpath下的所有jar包和类。 除了BootstrapClassLoader其他类加载器均由 Java 实现且全部继承自java.lang.ClassLoader 类的加载几乎是由上述3种类加载器相互配合执行的在必要时我们还可以自定义类加载器。 需要注意的是Java虚拟机对Class文件采用的是按需加载的方式也就是说当需要使用该类时才会将它的Class文件加载到内存生成Class对象。 双亲委派模型 概念 每一个类都有一个对应它的类加载器。在加载类的时候是采用的双亲委派模型即把请优求先交给父类处理的一种任务委派模式。 系统中的类加载器在协同工作的时候会默认使用 双亲委派模型 。//加入Java开发交流君样756584822一起吹水聊天 双亲委派模型的理论很简单分为如下几步 即在类加载的时候系统会首先判断当前类是否被加载过。已经被加载的类会直接返回否则才会尝试加载。 加载的时候首先会把该请求委派给该父类加载器的 loadClass()处理因此所有的请求最终都应该传送到顶层的启动类加载器 BootstrapClassLoader 中。 当父类加载器无法处理时才由自己来处理。 AppClassLoader的父类加载器为ExtensionClassLoader ExtensionClassLoader 的父类加载器为null当父类加载器为null时会使用启动类加载器BootstrapClassLoader 作为父类加载器。 为什么要使用双亲委派模型 试想一种情况我们在项目目录下手动创建了一个java.lang 包并在该包下创建了一个Object这时候我们再去启动Java程序原生Object会被篡改吗当然是不会的 因为Object类是Java的核心库类由BootstrapClassLoader加载而自定义的java.lang.Object类应该是由AppClassLoader来加载。 BootstrapClassLoader先于AppClassLoader进行加载根据上面的双亲委派模型的概念我们可以知道java.lang.Object类已经被加载并且AppClassLoader要加载类之前都要先给其父类过目所以自己写的野类是无法撼动核心库类的。 结论 双亲委派模型保证了Java程序的稳定运行可以避免类的重复加载也保证了 Java 的核心 API 不被篡改。 源码分析 双亲委派模型的都集中在java.lang.ClassLoader 的 loadClass()中相关代码如下所示 private final ClassLoader parent; protected Class? loadClass(String name, boolean resolve)throws ClassNotFoundException{synchronized (getClassLoadingLock(name)) {// 首先检查请求的类是否已经被加载过Class? c findLoadedClass(name);if (c null) {long t0 System.nanoTime();try {//父加载器不为空调用父加载器loadClass()方法处理if (parent ! null) {c parent.loadClass(name, false);} else {//父加载器为空使用启动类加载器 BootstrapClassLoader 加载c findBootstrapClassOrNull(name);}} catch (ClassNotFoundException e) {//抛出异常说明父类加载器无法完成加载请求}if (c null) {long t1 System.nanoTime();//自己尝试加载c findClass(name);// this is the defining class loader; record the statssun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);sun.misc.PerfCounter.getFindClasses().increment();}}//加入Java开发交流君样756584822一起吹水聊天if (resolve) {resolveClass(c);}return c;}}反双亲委派模型 双亲委派模型是Java默认的假如我们不想用双亲委派我们要怎么办呢 我们可以自定义一个类加载器除了BootstrapClassLoader其他类加载器均由 Java 实现且全部继承自java.lang.ClassLoader。如果我们要自定义自己的类加载器很明显需要继承ClassLoader。 从上面的源码我们知道双亲委派模型的都集中在java.lang.ClassLoader 的 loadClass()中如果想打破双亲委派模型则需要重写 loadClass() 方法。 如果我们不想打破双亲委派模型就重写 ClassLoader类中的 findClass()方法即可无法被父类加载器加载的类最终会通过这个方法被加载。 最后祝大家早日学有所成拿到满意offer
http://www.zqtcl.cn/news/137681/

相关文章:

  • 网站设计包含哪些技术外行怎么做网站
  • 网站建设运营知识推广软文平台
  • 营销型网站建设用途网站 文件夹结构
  • 制作网站建设策划方案cosy主题wordpress
  • 网站建设服务联享科技net和cn哪个做网站好
  • 深圳网站制作公司哪家好艺考培训学校
  • 潍坊网站的公司电话html网站开发基础
  • 网站模板样式做地图特效的网站
  • 商标查询官方网站有没有免费找客户的软件
  • 网站开发及服务合同行业网站名称
  • 网站建设费包括什么建筑设计领域
  • 网站建设 信科网络建行网站会员注册用户名
  • 网站建设的什么是开发实施注意什么网站开发实用技术pdf
  • 网站设计的资质叫什么贵阳网站建设咨询
  • 郑州哪家公司做网站怎么做自己的销售网站
  • 北大青鸟教网站开发吗中国电信 网站备案
  • 网站目录结构图wordpress ftp连接不上
  • 使用php做的网站有哪些网站备案密码重置申请表
  • php网站开发好找工作吗一叶子电子商务网站建设策划书
  • 运营好还是网站开发好购买域名后怎样建公司官网
  • 优秀设计网站推荐晋江市住房和城乡建设局网站
  • 杭州市区网站制作单位青海公路建设服务网站
  • 大型门户网站建设美丽杭州房价
  • 素材下载解析接口网站开发网站关键词热度
  • 山东seo推广网站建设新乡手机网站建设官网
  • 网站定制公司报价wordpress清新模板下载
  • 斗鱼网站开发是用什么语言东莞人才网智通
  • 淘宝上网站建设为啥这么便宜自己如何建设个网站
  • 做网站判多少年滦南网站建设
  • 网站开发难不难学做网站会提供源代码吗