JVM 工作原理
jvmoverloads原理

jvmoverloads原理摘要:一、JVM 概述1.JVM 的作用2.JVM 的架构二、JVM Overloads 原理1.JVM Overloads 的概念2.JVM Overloads 的工作原理3.JVM Overloads 的优势三、JVM Overloads 的实现1.动态类加载2.动态方法替换3.动态参数调整四、JVM Overloads 的应用场景1.性能优化2.代码隔离3.模块化开发五、JVM Overloads 的局限性与挑战1.兼容性问题2.安全问题3.开发与维护成本正文:一、JVM 概述Java 虚拟机(JVM,Java Virtual Machine)是Java 语言的核心组件,它负责充当Java 代码和底层操作系统之间的中间层。
JVM 具有跨平台特性,可以在任何支持JVM 的操作系统上运行Java 程序。
JVM 的架构包括类加载器、执行引擎、垃圾回收器等部分。
二、JVM Overloads 原理1.JVM Overloads 的概念JVM Overloads,即JVM 超载,是一种动态优化技术。
它允许在运行时根据不同的运行环境动态地加载、替换或调整类和方法的实现,从而提高程序的性能和灵活性。
2.JVM Overloads 的工作原理JVM Overloads 的工作原理主要包括动态类加载、动态方法替换和动态参数调整。
首先,JVM Overloads 会在运行时根据类路径和类加载器策略动态地加载类。
其次,它会对类中的方法进行替换,以实现不同的功能。
最后,它还会根据运行时的参数情况调整方法的参数。
3.JVM Overloads 的优势JVM Overloads 的主要优势在于提高了程序的运行效率和灵活性。
由于JVM Overloads 可以在运行时动态地加载类和方法,因此可以避免一些不必要的类和方法的加载,从而提高程序的启动速度。
同时,JVM Overloads 还可以根据不同的运行环境实现代码的隔离和模块化,使得程序更加灵活和易于维护。
jvm的gc原理

jvm的gc原理JVM的GC原理一、概述JVM(Java虚拟机)是Java程序运行的环境,其中最重要的组成部分之一就是垃圾回收(Garbage Collection,简称GC)机制。
GC的作用是自动管理程序中的内存,及时释放不再使用的对象,以避免内存泄漏和内存溢出的问题。
本文将对JVM的GC原理进行详细介绍。
二、垃圾回收算法1. 标记-清除算法标记-清除算法是最基本的垃圾回收算法之一。
它的过程分为两个阶段:标记阶段和清除阶段。
在标记阶段,GC会从根节点(一般是程序中的静态变量和栈中的引用)开始,递归地遍历对象图,标记出所有被引用的对象。
在清除阶段,GC会遍历整个堆,清除所有未被标记的对象。
2. 复制算法复制算法是针对标记-清除算法的改进。
它将堆分为两个区域,每次只使用其中一个区域。
当一个区域的对象被标记后,将其复制到另一个区域中,然后清除原来的区域。
这样可以解决碎片问题,但是需要额外的空间来存储复制的对象。
3. 标记-整理算法标记-整理算法是对标记-清除算法的改进。
它的过程与标记-清除算法类似,但是在清除阶段,标记-整理算法会将存活的对象向一端移动,然后清除边界外的所有对象。
这样可以解决碎片问题,并且不需要额外的空间。
4. 分代算法分代算法是针对对象的生命周期不同而提出的。
一般来说,对象的生命周期可以分为年轻代和老年代。
年轻代中的对象生命周期较短,老年代中的对象生命周期较长。
分代算法将堆分为年轻代和老年代两个区域,分别采用不同的垃圾回收算法。
年轻代一般使用复制算法,老年代一般使用标记-清除算法或标记-整理算法。
三、GC的执行过程1. 初始标记初始标记阶段是GC的第一步,它的目的是标记出所有的根对象,并且停止所有的应用线程。
这个过程是短暂的,因为只需要标记出与根对象直接关联的对象。
2. 并发标记并发标记阶段是GC的核心步骤,它的目的是通过并发执行来标记出所有的存活对象。
在这个阶段,GC会遍历整个堆,标记出与根对象直接或间接关联的存活对象。
jvm sandbox 原理

jvm sandbox 原理JVM沙箱原理JVM(Java虚拟机)沙箱是一种安全机制,用于保护计算机系统免受恶意软件和不受信任的代码的威胁。
沙箱通过限制应用程序的访问权限和资源使用来确保其在一个受控的环境中运行。
本文将详细介绍JVM沙箱的原理和工作方式。
1. 什么是JVM沙箱?JVM沙箱是Java虚拟机提供的一种安全机制,它将应用程序隔离在一个受控的环境中,以防止恶意代码对系统的攻击。
JVM沙箱通过限制应用程序的权限和资源访问来保护系统的安全。
2. JVM沙箱的工作原理JVM沙箱的工作原理可以概括为以下几个步骤:2.1 类加载在JVM沙箱中,所有的类都由Java虚拟机的类加载器加载。
类加载器负责从文件系统、网络或其他来源加载Java类,并将其转换为可执行代码。
2.2 字节码验证在类加载的过程中,JVM会对字节码进行验证以确保其符合Java语言规范。
字节码验证的目的是检测潜在的安全漏洞,例如类型转换错误、数组越界访问等。
2.3 安全检查在字节码验证之后,JVM会进行安全检查,以确保应用程序的行为不会对系统造成危害。
安全检查包括对应用程序的访问权限和资源使用进行限制,例如文件系统访问、网络访问、系统调用等。
2.4 沙箱执行经过字节码验证和安全检查后,JVM会将应用程序放入一个沙箱中执行。
沙箱是一个受控的环境,它限制了应用程序对系统资源的访问。
应用程序只能在沙箱中执行,无法直接访问系统资源。
2.5 安全策略JVM沙箱还提供了安全策略机制,用于进一步限制应用程序的行为。
安全策略定义了应用程序可以执行的操作,例如文件读写、网络访问等。
通过配置安全策略,可以根据实际需求对应用程序的权限进行精细控制。
3. JVM沙箱的优势JVM沙箱具有以下几个优势:3.1 隔离性JVM沙箱将应用程序隔离在一个受控的环境中,防止其对系统造成危害。
即使应用程序存在安全漏洞,也不会对系统产生影响。
3.2 可移植性由于JVM沙箱是基于Java虚拟机实现的,因此具有很好的可移植性。
JVM工作原理

JVM工作原理JVM(Java虚拟机)是Java程序的运行环境,它负责将Java源代码编译成可执行的字节码,并提供运行时环境来执行字节码。
JVM的工作原理涉及到类加载、内存管理、垃圾回收、即时编译等多个方面。
1. 类加载JVM通过类加载器(ClassLoader)来加载Java类。
类加载器根据类的全限定名(包括包名和类名)在类路径中查找对应的字节码文件,并将其加载到内存中。
类加载器采用双亲委派模型,即先由父类加载器尝试加载类,如果父类加载器无法加载,则由子类加载器尝试加载。
这种模型保证了类的唯一性和安全性。
2. 内存管理JVM将内存分为多个区域,包括方法区、堆、栈和程序计数器。
方法区存储类的元数据信息,如字段、方法、常量池等。
堆是存放对象实例的区域,通过垃圾回收机制来管理内存的分配和释放。
栈用于存储方法的局部变量和方法调用信息。
程序计数器用于指示当前线程执行的字节码指令。
3. 垃圾回收JVM通过垃圾回收机制自动回收不再使用的对象内存。
垃圾回收器会定期扫描堆内存,标记所有还在使用的对象,然后清理掉未被标记的对象。
常见的垃圾回收算法有标记-清除、复制、标记-整理等。
JVM还提供了不同的垃圾回收器,如Serial、Parallel、CMS、G1等,可以根据应用场景选择合适的垃圾回收器。
4. 即时编译JVM使用即时编译器(Just-In-Time Compiler)将热点代码(经常被执行的代码)编译成本地机器码,以提高执行效率。
JVM会监测程序的运行情况,根据热点代码的执行频率和调用关系进行优化编译。
即时编译器可以选择不同的编译策略,如解释执行、编译执行或混合执行。
5. 内存模型JVM定义了Java程序在多线程环境下的内存模型,保证多线程的内存可见性和有序性。
内存模型规定了线程之间如何进行通信和同步。
JVM使用主内存和工作内存的概念,线程之间的共享变量存储在主内存中,每个线程有自己的工作内存,线程对共享变量的操作先在工作内存中进行,然后通过主内存来同步和通信。
面试谈jvm原理

面试谈jvm原理Java虚拟机(JVM)是Java语言运行的基础。
JVM具有封装性、跨平台性、高度优化和可扩展性等特点,是Java应用程序的核心。
在Java的诞生初期,由于硬件环境和操作系统制约,JVM起到了垫底的作用。
而今天,JVM已经成为Java 运行效率和安全性的保障。
下面是一些我认为JVM原理面试时可能会涉及的重点:1. JVM的内存模型:JVM将内存分为堆内存和栈内存,堆内存用于存储对象实例和数组,而栈内存则用于存储方法的执行状态。
同时,JVM还有方法区和永久代的概念。
这些内存区域的大小和分配情况会影响JVM的性能和稳定性。
2. 垃圾回收机制:JVM的内存管理包括垃圾回收机制和内存分配机制。
垃圾回收机制是JVM实现自动内存管理的核心,JVM会周期性地扫描堆内存中没有被引用的对象,并自动回收它们所占用的内存。
垃圾回收机制常用的算法包括标记清除、复制和标记整理等。
3. 类加载机制:Java程序在运行时,需要将类文件中的二进制数据加载到JVM 中,才能执行相应的操作。
类加载机制将类文件加载到JVM中,并将它们解析为Java类。
类加载机制包括三个阶段:加载、链接和初始化。
4. JIT编译器:JIT(Just In Time)编译器是JVM在运行时动态优化的关键组件。
JIT编译器可以在程序运行时,根据代码的执行情况,生成本地机器代码,以提高程序的效率。
5. JVM调优:JVM的性能和稳定性很大程度上取决于JVM参数的设置和调整。
面试时,可能会涉及到如何根据系统的特点和需求,设置JVM参数以达到最佳性能和稳定性的问题。
总之,有关JVM原理的面试问题,往往涉及到JVM的内存模型、垃圾回收机制、类加载机制、JIT编译器和JVM调优等方面。
需要候选人对这些方面有比较深入的了解。
java虚拟机的工作原理

java虚拟机的工作原理Java虚拟机(JVM)是Java程序运行的环境,它负责解释和执行Java字节码。
JVM的工作原理可以分为三个主要的部分:类加载、字节码执行和垃圾回收。
1.类加载:JVM通过类加载器将Java字节码加载到内存中。
类加载器根据类路径在文件系统或网络中查找并读取字节码文件,然后将其转化为JVM运行时数据结构,如类和方法的元数据。
加载完成后,JVM会在方法区中存储类的元数据,并在堆中分配内存来存储类的实例。
2.字节码执行:3.垃圾回收:JVM提供垃圾回收机制来自动释放不再使用的内存。
JVM会跟踪每个对象的引用,当一个对象没有引用时,即被视为垃圾。
垃圾回收器定期执行垃圾收集操作,释放垃圾对象占用的内存。
垃圾回收器有不同的实现策略,如标记-清除、引用计数、复制、标记-整理等。
除了以上三个主要的部分,JVM还包含其他组件,如堆内存、栈、方法区等。
堆内存用于存储对象实例,栈用于存储局部变量和方法调用参数,方法区用于存储类的元数据和静态数据。
JVM的工作过程如下:1. 通过类加载器加载Java字节码。
2.解释执行或JIT编译字节码。
3.根据需要进行垃圾回收和内存管理。
4.执行程序。
JVM的优点是跨平台性、自动内存管理和高性能。
通过JVM,Java程序可以在不同的硬件和操作系统上运行,无需修改源代码。
JVM的自动内存管理功能减轻了开发人员对内存管理的负担,避免了内存泄漏和越界访问等错误。
JVM的即时编译技术能够将热点代码优化为本地机器代码,提高程序的执行效率。
在实际的Java应用开发中,了解JVM的工作原理有助于编写高效的代码和解决性能问题。
开发人员可以通过调整JVM参数、选择合适的垃圾回收器和内存分配策略来优化程序的性能。
同时,了解JVM的工作原理还有助于理解虚拟机层面的问题和调优技巧,提升应用的可靠性和稳定性。
jvm原理
JVM 原理解释JVM 全称是 Java Virtual Machine ,Java 虚拟机,这个 JVM 你是看不到的,它存在内存中。
我们知道计算机的基本构成是:运算器、控制器、存储器、输入和输出设备,那这个 JVM 也是有这成套的元素,运算器是当然是交给硬件 CPU 还处理了,只是为了适应“一次编译,随处运行”的情况,需要做一个翻译动作,于是就用了JVM 自己的命令集,JVM 的命令集则是可以到处运行的,因为 JVM 做了翻译,根据不同的CPU ,翻译成不同的机器语言。
JVM 是一个内存中的虚拟机,那它的存储就是内存了,我们写的所有类、常量、变量、方法都在内存中。
JVM 的组成部分Class Loader 类加载器类加载器的作用是加载类文件(.class)到内存,Class Loader 加载的 class 文件是有格式要求的。
类加载的最终产品是位于运行时数据区的堆区的Class对象。
Class对象封装了类在方法区内部的数据结构。
并且向JAVA程序提供了访问类在方法区内的数据结构。
JVM加载class文件的原理机制1. Java 中的所有类,必须被装载到 JMV 中才能运行,这个装载工作是由 JVM 中的类装载器完成的,类装载器所做的工作实质是把类文件从硬盘读取到内存中。
2. Java中的类大致分为三种:a) 系统类b) 扩展类c) 由程序员自定义的类3. 类装载方式,有两种:a) 隐式装载,程序在运行过程中当碰到通过 new 等方式生成对象时,隐式调用类装载器加载对应的类到jvm中。
b) 显式装载,通过 class.forname() 等方法,显式加载需要的类。
4. 类加载的动态性体现一个应用程序总是由n多个类组成,Java 程序启动时,并不是一次把所有的类全部加载后再运行,它总是先把保证程序运行的基础类一次性加载到 JVM 中,其它类等到 JVM 用到的时候再加载,这样的好处是节省了内存的开销。
jvm底层原理
jvm底层原理Java虚拟机(JVM)是一个虚拟环境,用于运行Java字节码和管理应用程序的内存。
它是Java程序模型和程序语言的基础,可以让Java程序在跨平台的操作系统中被执行和运行。
JVM的底层原理是什么呢?本文将探索JVM的底层原理以及它是如何实现跨平台运行的。
JVM的底层原理就是:将Java程序编译为字节码,然后由JVM 负责执行这些字节码,并负责管理Java程序的内存。
JVM由几部分组成:类加载器、解释器、调用处理器和运行时数据区。
首先,类加载器会加载Java源程序,将其编译为字节码,字节码会被加载到解释器中。
解释器定义了基本的Java语言规则,然后会解释、执行字节码,并将执行结果反馈给调用处理器。
调用处理器会对不同方法调用做出不同反应,这些方法调用包括内部类方法调用、虚拟方法调用等。
接下来,运行时数据区会存储程序的各种变量和对象,并且管理内存。
最后,JVM会利用垃圾回收机制来管理内存,确保程序不出现内存泄漏问题。
因此,JVM的底层原理是:将程序编译为字节码,由解释器解释执行,由调用处理器控制方法调用,由运行时数据区管理内存,然后由垃圾回收机制管理内存,最后实现跨平台的运行。
JVM的底层原理极大地改善和简化了Java程序的运行,使得Java 程序能够在不同平台上运行。
JVM的底层原理不仅提高了Java程序的执行效率,而且提供了安全的程序运行环境,确保了Java程序的稳定性。
总之,JVM的底层原理是一个重要的技术,使得Java程序能够跨平台地运行,提高了程序执行效率,提供了一个安全的运行环境。
研究JVM的底层原理,一定会帮助Java程序员实现更高效和安全的程序编写。
java jvm 空间担保机制
java jvm 空间担保机制摘要:1.引言2.JVM 空间担保机制的概念3.JVM 空间担保机制的工作原理4.JVM 空间担保机制的优势5.总结正文:Java 虚拟机(JVM)是Java 语言的核心组件,负责充当Java 字节码和底层操作系统之间的中间层。
在JVM 中,空间担保机制是一个重要的特性,它有助于确保Java 程序在运行过程中能够获得足够的内存资源。
接下来,我们将详细介绍JVM 空间担保机制的概念、工作原理、优势等方面的内容。
1.引言在Java 程序运行过程中,JVM 需要为每个线程分配一定的内存空间,以存储程序的运行数据。
然而,由于程序运行的复杂性和不确定性,JVM 在为线程分配内存时可能会遇到资源不足的问题。
为了解决这个问题,JVM 引入了空间担保机制,以提供一种可靠的方式来管理内存资源。
2.JVM 空间担保机制的概念JVM 空间担保机制是一种在运行时确保Java 程序能够获得足够内存资源的方法。
它通过为每个线程分配一个虚拟的内存空间(也称为内存堆)来实现这一目标。
在这个内存堆中,线程可以存储和管理其运行时需要的数据。
JVM空间担保机制的主要目标是确保线程始终有足够的内存资源来执行任务,同时避免内存资源的浪费。
3.JVM 空间担保机制的工作原理JVM 空间担保机制的工作原理可以分为以下几个步骤:- 初始化:在Java 程序启动时,JVM 会为每个线程创建一个内存堆。
这个内存堆的初始大小由JVM 参数(如-Xms)指定。
- 分配:当线程需要内存资源时,JVM 会根据当前堆的大小和线程所需的资源量进行内存分配。
如果堆空间充足,JVM 会直接为线程分配内存;否则,JVM 会触发内存回收操作,释放不再使用的内存空间,然后再次尝试为线程分配内存。
- 回收:当线程不再需要某些内存资源时,JVM 会通过垃圾回收(GC)算法来回收这些资源。
垃圾回收算法的目标是通过释放不再使用的内存空间来增加堆的大小,以便为其他线程分配更多的内存资源。
JVM运行机制及其原理
JVM运行机制及其原理JVM(Java Virtual Machine)是Java虚拟机的缩写,是运行Java 字节码的虚拟计算机。
它是Java平台的核心组件,负责在不同的操作系统上执行Java程序。
JVM运行机制主要包括类加载、字节码解释、即时编译、垃圾收集等过程,下面将详细介绍JVM运行机制及其原理。
1.类加载当一个Java程序被运行时,JVM会首先加载程序的主类,然后根据程序的依赖关系逐步加载相关的类。
类加载过程主要分为加载、验证、准备、解析和初始化几个阶段:-加载:通过类加载器将类文件加载到内存中。
- 验证:确保加载的类符合Java语言规范和JVM规范。
-准备:为类的静态变量分配内存并初始化为默认值。
-解析:将符号引用转换为直接引用。
-初始化:执行类的初始化方法。
2.字节码解释加载完类文件后,JVM会通过解释器将字节码文件逐条解释执行,将每条字节码翻译成对应的机器代码并执行。
这种方式简单直接,但效率较低,适用于少量代码和频繁切换的情况。
3.即时编译4.垃圾收集JVM还负责管理程序的内存,包括分配内存、回收无用内存等。
在Java中,内存是通过堆和栈来管理的,堆用于存放对象实例,栈用于存放基本数据类型和方法调用。
JVM通过垃圾收集器来管理堆内存,自动回收不再使用的对象,并将内存释放出来供其他对象使用。
5.类加载器类加载器是JVM的重要组成部分,负责加载class文件,并将其转换成JVM可以识别的数据结构。
JVM中存在多个类加载器,分为三个级别:启动类加载器、扩展类加载器和应用程序类加载器。
类加载器采用双亲委派模型,当需要加载一个类时,先委托给父类加载器加载,只有当父类加载器无法找到类时,才由自己加载。
6.内存模型JVM中的内存分为程序计数器、虚拟机栈、本地方法栈、堆、方法区等几部分。
程序计数器记录当前指令执行的位置;虚拟机栈用于存放局部变量表和操作数栈;本地方法栈用于支持本地方法调用;堆用于存放对象实例;方法区用于存放类信息、静态变量等。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
反射的关键:要实现动态的调用,最明显的方法就是动态的生成字 节码,加载到JVM中并执行
JVM的体系结构之执行引擎
(1)Class actionClass=Class.forName(外部实现类);
调用本地方法,使用调用者所在的ClassLoader来加载创建出Class对象;
(2)Method method=actionClass.getMethod(“execute”,null);
(3)初始化
初始化过程即为执行类中的静态初始化代码、构造器代码以及静态属性的初始化,在四种情况下初 始化过程会被触发执行: 调用了new;反射调用了类中的方法;子类调用了初始化;JVM启动过程中指定的初始化类。
JVM的体系结构之类加载器
JVM的体系结构之类加载器
一、JVM两种类装载器包括:启动类装载器和用户自定义类装载器,启动类装 载器是JVM实现的一部分,用户自定义类装载器则是Java程序的一部分,必须是 ClassLoader类的子类。 二、 主要分为以下几类:
内容
JVM的生命周期 JVM的体系结构 JVM类加载器 JVM执行引擎 JVM运行时数据区 JVM垃圾回收 问题
JVM的体系结构
JVM的体系结构
一、 JVM的内部体系结构分为三部分, (1)类装载器(ClassLoader)子系统 作用: 用来装载.class文件 (2)执行引擎 作用:执行字节码,或者执行本地方法 (3)运行时数据区 方法区,堆,java栈,PC寄存器,本地方法栈
JVM的体系结构之执行引擎
二、反射机制是Java的亮点之一,基于反射可动态调用某对象实例中对应的方法 、访问查看对象的属性等,而无需在编写代码时就确定需要创建的对象,这 使得Java可以实现很灵活的实现对象的调用,代码示例如下:
Class actionClass=Class.forName(外部实现类); Method method=actionClass.getMethod(“execute”,null); Object action=actionClass.newInstance(); method.invoke(action,null);
淘宝技术大学 应届生培训 JVM工作原理
课程组: 课程组:雷卷 小邪 九穆
版本:第一版2009年
达到的目标
知道Java虚拟机的生存周期 知道JVM的体系结构 知道JVM体系结构中的各个部分 能对JVM有个大致清晰的了解
内容
JVM的生命周期 JVM的体系结构 JVM类加载器 JVM执行引擎 JVM运行时数据区 JVM垃圾回收 问题
JVM的体系结构之类加载器
三、ClassLoader抽象类提供了几个关键的方法:
(1)loadClass 此方法负责加载指定名字的类,ClassLoader的实现方法为先从已经加载的类中寻找,如没有则继 续从parent ClassLoader中寻找,如仍然没找到,则从System ClassLoader中寻找,最后再调用 findClass方法来寻找,如要改变类的加载顺序,则可覆盖此方法 (2)findLoadedClass 此方法负责从当前ClassLoader实例对象的缓存中寻找已加载的类,调用的为native的方法。 (3) findClass 此方法直接抛出ClassNotFoundException,因此需要通过覆盖loadClass或此方法来以自定义的方式 加载相应的类。 (4) findSystemClass 此方法负责从System ClassLoader中寻找类,如未找到,则继续从Bootstrap ClassLoader中寻找, 如仍然为找到,则返回null。 (5)defineClass 此方法负责将二进制的字节码转换为Class对象 (6) resolveClass 此方法负责完成Class对象的链接,如已链接过,则会直接返回。
JVM的体系结构之类加载器
四、简单的classLoader例子
/* * 格式化文件所对应的路径 */ public static String FormatClassName(String name){ FILEPATH= DEAFAULTDIR + name+".class"; return FILEPATH; } /* * main方法测试 */ public static void main(String[] args) throws Exception { AutoClassLoader acl = new AutoClassLoader(); Class c = acl.findClass("testClass"); Object obj = c.newInstance(); Method m = c.getMethod("getName",new Class[]{String.class ,int.class}); m.invoke(obj,"你好",123); System.out.println(c.getName()); System.out.println(c.getClassLoader()); System.out.println(c.getClassLoader().getParent()); }
校验此Class是否为public类型的,以确定类的执行权限,如不是public类型的,则直接抛出 SecurityException; 调用privateGetDeclaredMethods来获取到此Class中所有的方法,在privateGetDeclaredMethods 对此Class中所有的方法的集合做了缓存,在第一次时会调用本地方法去获取; 扫描方法集合列表中是否有相同方法名以及参数类型的方法,如有则复制生成一个新的Method对 象返回; 如没有则继续扫描父类、父接口中是否有此方法,如仍然没找到方法则抛出 NoSuchMethodException;
(2)链接
链接过程负责对二进制字节码的格式进行校验、初始化装载类中的静态变量以及解析类中调用的接 口、类。 在完成了校验后,JVM初始化类中的静态变量,并将其值赋为默认值。 最后一步为对类中的所有属性、方法进行验证,以确保其需要调用的属性、方法存在,以及具备应 的权限(例如public、private域权限等),会造成NoSuchMethodError、NoSuchFieldError等错误 信息。
内容
JVM的生命周期 JVM的体系结构 JVM类加载器 JVM执行引擎 JVM运行时数据区 JVM垃圾回收 问题
JVM的体系结构之类加载器
一、 JVM将整个类加载过程划分为了三个步骤: (1)装载
装载过程负责找到二进制字节码并加载至JVM中,JVM通过类名、类所在的包名通过ClassLoader 来完成类的加载,同样,也采用以上三个元素来标识一个被加载了的类:类名+包名+ClassLoader 实例ID。
JVM的体系结构之类加载器
四、简单的classLoader例子
/* * 重写ClassLoader类的findClass方法,将一个字节数组转换为 Class 类的实例 */ public Class<?> findClass(String name) throws ClassNotFoundException { byte[] b = null; try { b = loadClassData(AutoClassLoader.FormatClassName(name)); } catch (Exception e) { e.printStackTrace(); } return defineClass(name, b, 0, b.length); } /* * 将指定路径的.class文件转换成字节数组 */ private byte[] loadClassData(String filepath) throws Exception { int n =0; BufferedInputStream br = new BufferedInputStream(new FileInputStream(new File(filepath))); ByteArrayOutputStream bos= new ByteArrayOutputStream(); while((n=br.read())!=-1){ bos.write(n); } br.close(); return bos.toByteArray(); }
内容
JVM的生命周期 JVM的体系结构 JVM类加载器 JVM执行引擎 JVM运行时数据区 JVM垃圾回收 问题
JVM的体系结构之执行引擎
一、JVM通过执行引擎来完成字节码的执行,在执行过程中JVM采用的是自己的 一套指令系统,每个线程在创建后,都会产生一个程序计数器(pc)和栈( Stack),其中程序计数器中存放了下一条将要执行的指令,Stack中存放 Stack Frame,表示的为当前正在执行的方法,每个方法的执行都会产生Stack Frame,Stack Frame中存放了传递给方法的参数、方法内的局部变量以及操 作数栈,操作数栈用于存放指令运算的中间结果,指令负责从操作数栈中弹出 参与运算的操作数,指令执行完毕后再将计算结果压回到操作数栈,当方法执 行完毕后则从Stack中弹出,继续其他方法的执行。 在执行方法时JVM提供了invokestatic、invokevirtual、invokeinterface和 invokespecial四种指令来执行 (1)invokestatic:调用类的static方法 (2) invokevirtual: 调用对象实例的方法 (3) invokeinterface:将属性定义为接口来进行调用 (4) invokespecial: JVM对于初始化对象(Java构造器的方法为:<init>) 以及调用对象实例中的私有方法时。
(1) Bootstrap ClassLoader 这是JVM的根ClassLoader,它是用C++实现的,JVM启动时初始化此ClassLoader,并由此 ClassLoader完成$JAVA_HOME中jre/lib/rt.jar(Sun JDK的实现)中所有class文件的加载,这个jar 中包含了java规范定义的所有接口以及实现。 (2) Extension ClassLoader JVM用此classloader来加载扩展功能的一些jar包 (3) System ClassLoader JVM用此classloader来加载启动参数中指定的Classpath中的jar包以及目录,在Sun JDK中 ClassLoader对应的类名为AppClassLoader。 (4) User-Defined ClassLoader User-DefinedClassLoader是Java开发人员继承ClassLoader抽象类自行实现的ClassLoader,基于 自定义的ClassLoader可用于加载非Classpath中的jar以及目录