JVM
jvm初学篇
1 JVM的启动流程
- 通过编辑器将java代码编辑好之后编译成java字节码,也就是.class文件;
- 装载JVM 会通过当前路径或者系统的版本去寻找 JVM.cfg文件;
- 通过JVM.cfg文件寻找到 JVM.dll文件 —该文件是JVM的具体实现;
- 初始化本地接口 JNI —如Env接口 JNI接口的作用就是负责将.class文件装载到JVM中;
- 找到main方法并执行
2 JVM的内存分区
1 PC寄存器
- — 每个线程拥有一个PC寄存器
- — 在线程创建时 创建(PC寄存器)
- — 指向下一条指令的地址
- — 执行本地方法时,PC的值为undefined(未定义)
2 方法区
— 保存装载的类信息
- 类型的常量池 —– 这一点得注意 : 在JDK6时,String等常量信息是保存在方法区,但是在JDK7时,已经移到了堆;
- 字段、方法信息
- 方法字节码
— 线程共享
— 通常和永久区(Perm:保存一些相对来说静止稳定的数据)关联在一起
3 Java堆
- — 和程序开发密切相关
- — 应用系统对象都保存在Java堆中
- — 线程共享
- — 对分带GC来说,堆也是分代的;
- — GC的主要工作区间
4 Java栈
- — 线程私有
- — 栈有一系列的帧组成(每执行一个方法就会忘栈中压入一个帧)
- — 帧保证一个方法的局部变量、操作数栈(如记录栈的出栈、入栈)、常量池指针
- — 先进后出(形象的比喻成一个杯子)
- — 一个重要的概念就是局部变量表
- — 栈上分配
- - 小对象(一般几十个bytes),在没有逃逸的情况下,可以直接分配在栈上
- - 直接分配在栈上,可以自动回收,减轻GC压力 因为一个函数调用结束之后栈帧自动弹出,不需要GC来回收
- - 大对象或者逃逸对象无法栈上分配
- - 小对象(一般几十个bytes),在没有逃逸的情况下,可以直接分配在栈上
- 上一篇: JVM初始化初步理解
- 下一篇: Java基础篇