jvm初学篇

1 JVM的启动流程

  1. 通过编辑器将java代码编辑好之后编译成java字节码,也就是.class文件;
  2. 装载JVM 会通过当前路径或者系统的版本去寻找 JVM.cfg文件;
  3. 通过JVM.cfg文件寻找到 JVM.dll文件 —该文件是JVM的具体实现;
  4. 初始化本地接口 JNI —如Env接口 JNI接口的作用就是负责将.class文件装载到JVM中;
  5. 找到main方法并执行

2 JVM的内存分区

1 PC寄存器

  • — 每个线程拥有一个PC寄存器
  • — 在线程创建时 创建(PC寄存器)
  • — 指向下一条指令的地址
  • — 执行本地方法时,PC的值为undefined(未定义)

2 方法区

  • — 保存装载的类信息

    • 类型的常量池 —– 这一点得注意 : 在JDK6时,String等常量信息是保存在方法区,但是在JDK7时,已经移到了堆;
    • 字段、方法信息
    • 方法字节码
  • — 线程共享

  • — 通常和永久区(Perm:保存一些相对来说静止稳定的数据)关联在一起

3 Java堆

  • — 和程序开发密切相关
  • — 应用系统对象都保存在Java堆中
  • — 线程共享
  • — 对分带GC来说,堆也是分代的;
  • — GC的主要工作区间

4 Java栈

  • — 线程私有
  • — 栈有一系列的帧组成(每执行一个方法就会忘栈中压入一个帧)
  • — 帧保证一个方法的局部变量、操作数栈(如记录栈的出栈、入栈)、常量池指针
  • — 先进后出(形象的比喻成一个杯子)
  • — 一个重要的概念就是局部变量表
  • — 栈上分配
    • - 小对象(一般几十个bytes),在没有逃逸的情况下,可以直接分配在栈上
    • - 直接分配在栈上,可以自动回收,减轻GC压力 因为一个函数调用结束之后栈帧自动弹出,不需要GC来回收
    • - 大对象或者逃逸对象无法栈上分配