1运行流程
整个流程是:
1. 通过java xx命令进入jvm中
2. 装载配置:根据当前的路径和系统版本寻找 jvm.cfg文件
3. 根据配置文件寻找jvm.dll 文件:jvm.dll文件为JVM的主要实现
4. 初始化JVM 得到JVM对应的接口和findClass等操作实现
5. 找到main()方法进行操作运行。
.Java文件在执行时候先转化为 .class文件再在虚拟机之中进行执行。
.Class文件在虚拟机之中的执行流程:
1. Class文件通过类加载器子系统进入内存空间。
2. Java堆,java栈进行操作(二进制操作)
3. 调用本地方法库将执行结果输出
4. 堆栈操作结束进行垃圾回收GC
由此可见JVM实现垃圾的自动回收机制,相对C++ 比较方便。
2.JVM结构
JVM的结构组成:
有表可以得到JVM 包括:
1. PC寄存器
2. 垃圾回收器
3. 方法区
4. Java堆
5. Java 栈
6. 本地方法栈
PC寄存器
每个线程拥有一个PC寄存器
在线程创建时创建的
指向下一条指令的地址
执行本地方法时,PC的值为undefined
方法区
保存装载的类信息
1类型的常量池
2 字段,方法信息
3方法字节码
Java堆
和程序开发密切相关
1.应用系统对象都保存在Java堆中
2.所有线程共享Java堆 (公共区域)
3.对分代GC来说,堆也是分代的
4.GC的主要工作区间
Java栈
1.线程私有
2.栈由一系列帧组成(因此Java栈也叫做帧栈)
3.帧保存一个方法的局部变量、操作数栈、常量池指针
4.每一次方法调用创建一个帧,并压栈
栈中包含:
1. 局部变量表包含参数和局部变量(static 方法和 非static 方法 栈中位置区别)
2. Java没有寄存器,所有参数传递使用操作数栈 。
在栈中的操作:
1. a进栈 --- 100 进栈中
2. b进栈 --- 98 进栈中
3. 弹出两个变量求和,和压栈 --198进栈
4. 弹出结果,放在局部变量2中 ----- c=a+b;
5. 局部变量2压栈 ------- c=198进栈
6. 返回结果 --------- return c;
栈上分配
分配对象:
1. 小对象(一般几十个bytes),在没有逃逸的情况下,可以直接分配在栈上
2. 直接分配在栈上,可以自动回收,减轻GC压力
3. 大对象或者逃逸对象无法栈上分配
JVM内存模型:
1. 主内存空间是共享空间
2. 工作内存空间是私有的空间
3. 线程工作内存与主内存之间数据更新有延迟
4. Volatile可以实现工作内存与主内存之间的数据快速更新
JVM运行:
1.解释运行
– 解释执行以解释方式运行字节码
– 解释执行的意思是:读一句执行一句
2编译运行(JIT)
– 将字节码编译成机器码
– 直接执行机器码
– 运行时编译
– 编译后性能有数量级的提升
编译运行效率高于解释运行的效率。