JVM知识点
2024-03-04 13:48:17 0 举报
JVM(Java Virtual Machine)是Java编程语言的核心,它负责运行Java程序。JVM是一个抽象的计算机,有自己的指令集和运行时数据区域。主要的运行时数据区域包括堆、栈、方法区和本地方法栈。JVM还有两个子系统:类加载器和垃圾回收器。类加载器负责动态加载类,垃圾回收器则负责回收不再使用的内存。JVM通过解释字节码文件(.class文件)来执行程序。字节码是一种中间代码,可以在安装了JVM的任何操作系统上运行。JVM的设计使得Java程序具有平台独立性和安全性。
作者其他创作
大纲/内容
方法
语义分析
运行时数据区域(JVM管理的内存)
实现多态的基础
当前类或接口声明的字段信息
推荐使用jclasslib
准备
类加载器的加载路径可以通过classloader -c hash值 查看
利用上下文类加载器加载类,比如JDBC和JNDI等
关联
Java.lang.Class
X
类加载器
保存了字符串常量、类或接口名、字段名主要在字节码指令中被使用
字段
InstanceKlcass
加载阶段
常用工具
javac源代码编译器
初始化
好处
基本信息
方法区
Class clazz = SimpleClass.class;// 获取方法信息Method[] methods = clazz.getMethods();// 获取字段信息Field[] fields = clazz.getFields();
这样Java虚拟机就能很好地控制开发者访问数据的范围
常量池
魔数、字节码文件对应的java版本号访问标识(public final等等)父类和接口
Java
对于开发者来说,只需要访问堆中的Class对象而不需要访问方法区中的所有信息
进行编译
加载应用使用的类
解析
三种渠道
01
类的属性,比如源码的文件名内部类的列表等
几个要点
第二步:类加载器在加载完类之后,java虚拟机会将字节码中的信息保存到方法区中
静态字段的数据
推荐使用阿里arthas
1、获取class字节码文件二进制字节流2、将磁盘文件静态结构载入内存方法区转换为运行时数据结构<类信息>3、将载入后的嘞信息进行组装,在堆空间中生成类对象(class),作为数据入口
启动类加载器Bootstrap
Java虚拟机
连接
写入内存
访问
类加载器ClassLoader
历史上Osgi框架实现了一套新的类加载器机制,允许同级之间委托进行类的加载
1、在类的加载过程中,每个类加载器都会先检查是否已经在加载了该类,如果已经加载则直接返回,否则会将加载请求委派给父类加载器2、如果类加载的parent为null,则会提交给启动类加载器处理3、如果所有的父类加载器都无法加载该类,则由当前类加载器自己尝试加载。所以看上去是自顶向下尝试
堆区
扩展类加载器Extension
属性
第四步:同时,java虚拟机还会在堆中生成一份与方法区中数据类似的java.lang.Class对象。作用是在java代码中去获取类的信息以及存储静态字段的数据(JDK8及之后)
Arthas中类加载器相关的功能
编译完成
执行静态代码块中的代码,并未静态变量赋值
.java源文件
加载
1、静态变量的定义使用final关键字,这类变量会在准备阶段直接进行初始化(除非要执行方法)2、直接访问父类的静态变量,不会触发子类的初始化。子类的初始化cinit调用之前,会优先调用父类的cinit初始化方法添加-XX:TraceClassLoading 参数可以打印出加载并初始化的类
自定义类加载器
字节码的组成
本地文件:磁盘上的字节码文件
语法分析
03
执行引擎(即时编译器、解释器、垃圾回收期等)
02
打开方式
1、保证类加载的安全性:外部想替换JDK的系统类,篡改他的实现时,因为父类加载器已经加载过JDK的系统类子类加载器不会在加载,从而能一定程度上防止危险代码的植入。2、避免重复加载
自定义类加载器并且重写loadClass方法,就可以将双亲委派机制的代码去除。Tomcat通过这种方法实现应用之间的隔离
执行类构造器<clinit>()生成class对象放入堆中
虚拟机底层实现C++
类加载器的继承关系可以通过classloader -t 查看
JVM
允许扩展Java中比较通用的类
虚方发表
加载流程:
抽象语法树
Osgi框架的类加载器
.class字节码文件
第三步:在方法区生成一个InstanceKlass对象,保存类的所有信息,里面还包含实现特定功能比如多态的信息
给静态变量分配内存并设置初始值
词法分析
查看内存中的对象
类加载器的hash值可以通过classloader -l来查看
使用
打破双亲委派机制的三种方式
当前类或接口声明的方法信息
应用程序类加载器Application
验证文件格式/元数据/字节码/符号引用等
InstanceKlass
验证
动态代理生成:程序运行时使用动态代理生成
线程上下文类加载器
双亲委派机制指的是:自底向上查找是否加载过,再由顶向下进行加载
注解抽象语法树
常量池符号引用替换为直接引用<因为多态>
通过网络传输的类:早起的Applet技术使用
类生命周期
字节码生成器
卸载
类加载器的双亲委派机制
第一步:类加载器根据类的全限定名通过不同的渠道以二进制的方式获取字节码信息。
加载Java中的最核心的类
0 条评论
回复 删除
下一页