class文件——》 jvm内存-》(验证(验证字节码文件格式是否正确))-》准备(静态变量初始值赋值(整型0,布尔值false, 对象null ))-》解析(符号引用-》直接引用(内存地址)(静态链接)(类加载期间),
静态方法被加载到内存(内存地址)静态符号,静态方法,不变的方法),
动态链接(javap -v 字节码文件Math.class)(字面量,程序运行时)
-》静态变量初始化为指定的值(叫初始化)
war/jar 真正用到加载
应用程序类加载器(classpath(idea的target))-》扩展类加载器(java.ext.dir)-》bootstrapLoader(lib)引导类加载器
已经加载类的集合里有没有这个类(有直接返回)(没有委托ext)-》有返回,没有委托父类(bootstrap加载器)-》委托 有,直接返回, 没有,尝试加载 (到lib包下找math类),没有不会加载转而委托下级加载(ext里找math类)-》转而委托应用程序类加载(classpath)
1)沙箱安全机制,防止核心API包被篡改
2)避免重复加载 全盘负责:当classLoader 装载一个类时,除非显示的使用另一个classloader,否则该类所依赖及引用类也由这个classLoader载入。
继承classloader->defineclass
java math.class ->类装载系统-》字节码文件放在内存区域-》
堆-》new 对象(也可以放在栈)
栈(线程栈,不同线程有自己的内存空间放变量)-》局部变量
栈帧:放方法内局部变量表,操作数栈,动态链接,方法出口
操作数栈:变量值(操作数的)的临时存放空间
javap:jdk自带,
javap -c Math.class Math.txt(Jvm内部汇编语言)javap -verbose(口语话)
javap -v Math.class Math.txt
动态链接:程序运行时解析, 符号引用的直接地址
静态链接: 程序加载时解析
方法出口:-》main
jvm给每个方法放独立栈帧空间(方法的内存隔离开来)
数据结构:栈(先进后出)
线程栈:数据结构的栈结构;
(PC寄存器)程序计数器(每个线程独/都有的):程序正在运行或马上运行 代码的内存位置(行号)
CPU(CPU寄存器组成)
字节码执行引擎动态修改程序计数器;
字节码.class->字节码执行引擎执行然后同步修改程序计数器
JMM java内存模型 线程模型 JVM
方法区:(元空间)常量,静态变量,类信息(代码),
运行时常量池,
本地方法栈(每个线程独有): native (C++实现, )
jdk jvm(内存释放等) (c实现,)
jdk 自带工具(jvisual vm)识别jvm进程
stw:?没懂
字节码:
局部变量表(编译确定)
实例方法中调用(this,局部变量,运行时把this作为第一个入参,作为一个隐式的入参传进来,传的局部变量表的第一个位置,所以会有一个坑位)
全类名
方法名
返回值
常量池:资源仓库,词话, 节省空间-》运行时常量池
最多实现多个接口(FFFF)(65535 = 1516^3+1516^2+15*16+15) 字段个数 字段表
字段表结构体:json对象、 属性表
方法的个数
好用的插件(view->show bytecode with jclasslib)插件-》jclasslib
jvm 助记符