字节码增强技术:AOP技术其实就是
字节码增强技术,
JVM提供的
动态代理追根究底也是
字节码增强技术。
目的:在
Java字节码生成之后,对其进行修改,
增强其功能,这种方式相当于对应用程序的二进制文件进行修改。
Java字节码增强主要是为了减少冗余代码,提高性能等。
应用场景:某一天系统出现OOM,通过工具分析,各
类的对象占用了很大空间,但是这个对象被许多程序访问,那么就很难找到,工程的全文匹配也只能找到自己的业务代码调用的地方,深入的反射,三方包调用无法匹配。这个时候AOP就可以帮助完成。
两种
实现机制:
JVM(Java Virtual Machine)是Java程序的执行环境。当你运行一个Java程序时,它首先被编译成字节码,然后JVM将字节码解释成机器码并执行。
JVM的类加载过程可以分为以下几个步骤:
1. 加载(Loading):加载指的是将.class文件读入内存,并为之创建一个java.lang.Class对象。类加载器会负责从文件系统、JAR文件或网络中加载类的字节码数据。
2. 链接(Linking):链接分为三个阶段,分别是验证(Verification)、准备(Preparation)和解析(Resolution)。
* 验证:验证字节码是否符合JVM规范,并且不会危害JVM的安全。如果验证失败,则会抛出java.lang.VerifyError异常。
* 准备:为类的静态变量分配内存,并将其初始化为默认值(0、null等)。
* 解析:将类、接口、字段和方法的符号引用解析为实际引用。这个过程可能需要在运行时进行。
3. 初始化(Initialization):在类加载过程中,初始化是最后一步。在这个阶段,静态变量被初始化,静态块被执行。如果初始化一个类时发生异常,则会抛出java.lang.ExceptionInInitializerError异常。
JVM的类加载器有以下几种:
1. 启动类加载器(Bootstrap ClassLoader):它是最顶层的类加载器,负责加载JVM的核心类库,如java.lang和java.util等。
2. 扩展类加载器(Extension ClassLoader):它加载Java平台扩展库的类。默认情况下,它从$JAVA_HOME/jre/lib/ext目录加载类。
3. 系统类加载器(System ClassLoader):也称应用程序类加载器,它加载应用程序类路径上的类。
4. 用户自定义类加载器:开发人员可以继承java.lang.ClassLoader类,以实现自己的类加载器。
总之,JVM的类加载过程是Java程序运行的重要部分,它可以确保Java程序的正确执行。