首页 > 代码库 > JVM学习积累

JVM学习积累

1. Java代码编译和执行的整个过程包含了三个重要的机制:

  • Java源码编译机制
  • 类加载机制
  • 类执行机制

2. 关于Java源码编译机制

  Java源码编译由以下三个过程组成:

  • 分析和输入符号表
  • 注解处理
  • 语义分析和生成class文件

  生成的class文件包括的信息有:

  • 结构信息(class文件格式版本号以及各部分的数量和大小的信息)
  • 元数据(源码中的声明与常量的信息,包括类继承的超类、实现接口的声明信息、域和方法声明信息及常量池)
  • 方法信息(对应源码中语句和表达式的相关信息,包含自己吗、异常处理器表、求值栈与局部变量区大小、求值栈的类型记录、调试符号信息)

  JVM的类加载时通过ClassLoader及其子类来完成的,类的层次关系和加载顺序如下图:

  

  • BootStrap ClassLoader 负责加载$JAVA_HOME中的 jre/lib/rt.jar 里所有的 class,由 C++实现,不是ClassLoader的子类
  • Extension ClassLoader 负责加载 Java 平台中扩展功能的一些 jar 包,包括 $JAVA_HOME 中 jre/lib/*.jar 或 -DJava.ext.dirs 指定目录下的jar包
  • App ClassLoader 负责加载 classpath 中指定的jar包及目录中class
  • Custom ClassLoader 属于应用程序根据自身需要定义的ClassLoader, 如 tomcat、jboss 都会根据 J2EE 规范自行实现 ClassLoader

3. Java 类执行机制

  JVM是基于栈的体系结构来执行 Class 字节码的,线程创建之后,都会产生程序计数器(PC)和栈(Stack),程序计数器存放下一条要执行的指令在方法内的偏移量,栈中存放一个个栈帧,每个栈帧对应着每个方法的每次调用,而栈帧又是局部变量区和操作数栈两部分组成,局部变量区用于存放方法中的局部变量和参数,操作数栈中用于存放方法执行过程中产生的中间结果。

4. JVM内存组成结构

  JVM内存由堆、栈、本地方法栈、方法去等部分组成

  堆 所有通过new创建的对象的内存都在堆中分配,其大小可以通过 -Xmx 和 -Xms 来控制。堆被划分为新生代和旧生代,新生代又被进一步划分为 Eden 和 Survivor 区,最后 Survivor 由 From Space 和 To Space 组成。

  新生代:新建的对象都是用新生代分配内存,Eden空间不足的时候,会把存活的对象转移到Survivor中,新生代大小可以由 -Xmn来控制, 也可以用 --XX:SurvivorRatio 来控制 Eden 和 Survivor 的比例;

  旧生代:用于存放新生代中经过多次垃圾回收仍然存活的对象

  

JVM学习积累