对象创建、内存布局和访问定位

对象的创建

  1. 虚拟机遇到一个new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用;
  2. 检查这个符号引用代表的类是否已经被加载,解析和初始化过。如果没有,那必须先执行响应的类加载过程;
  3. 在类加载检查功通过后,为新生对象分配内存。对象所需的内存大小在类加载完成后便可完全确定。

从源文件到字节码

过程

源码转化成字节码的过程
源码转化成字节码的过程

分析

词法解析是通过空格分割出单词、操作符、控制符符等信息,将其形成 token 信息流, 传递给语法解析器;在语法解析时,把词法解析得到的 token 信息流按照 Java 语法规则组装成一颗语法树,如图虚线框所示;在语义分析阶段,需要检查关键字的使用是否合理、类型是否匹配、作用域是否正确等;当语义分析完成之后,即可生成字节码。

字节码必须通过类加载过程加载到 JVM 环境,才可以执行。执行有三种模式:第一,解释执行;第二,JIT编译执行;第三,JIT 编译与解释混合执行(主流JVM默认执行模式)。混合执行模式的优势在于解释器在启动时先解释执行,省去编译时间。随着时间推进,JVM 通过热点代码统计分析,识别高频的方法调用、循环体、公共模块等,基于强大的 JIT 动态编译技术,将热点代码转换成机器码,直接交给 CPU 执行
JIT 的作用是将 Java 字节码动态的编译成可以直接发送给处理器指令执行的机器码。