什么是JVM
Write Once Run Everywhere
- 软件层面机器码翻译( .class ====> 1 2 1 2 )
- 内存管理
为什么学习JVM
出现内存溢出,内存泄漏我们是一无所知的,so
运行时数据区
代码分类:数据 指令 控制
程序计数器:
指向当前线程正在执行的字节码指令的地址 行号。why 线程被挂起再次运行时,通过程序计数器指向的地址 continue。
虚拟机栈:
存储当前线程运行方法所需要的数据 指令 返回地址。why 最小执行单元线程是做事情的,怎么做由人控制
虚拟机栈存储单元:栈帧(方法)
栈帧:
局部变量表:
编译期就知道大小的区块,定长的。32位
操作数栈:
字节码文件反编译:javap -c -v xxx.class > p.txt
动态链接:
接口注入,运行时指向真正的实例。常量池(元数据信息,final常量,String)
出口:
返回地址,出栈。
本地方法栈:
方法区:
类信息
常量
静态变量
JIT
heap:
内存模型:
对象的生命周期不一样 ==>分代
Meta Space
为了解决永久代溢出的问题,类似ArrayList可扩容。