JVM基础知识

概述

java虚拟机是一台虚拟的机器,在这台机器上可以运行java源代码编译后的class文件,运行的入口是main方法,第一步是找到main方法,然后开始执行main方法,java类中的方法都会被编译器编译为字节码,字节码也就是指一个字节一个字节的二进制代码,字节码和所有的汇编语言一样是有很多指令组成的,每条指令有分为操作码和操作数部分,操作数并不是必须的,简单的指令如iadd会将操作数栈中的两个整型数字相加,然后把结果再放入操作数栈中。

数据结构

每个方法被编译器编译为字节码,运行时的数据结构是所有的方法都会被包装成一个栈帧(stack frame),栈帧被放入虚拟机栈中(jvm stack),栈帧中又包括了局部变量表和操作数栈,这两个结构的大小会在编译时计算好。

虚拟机指令

虚拟机指令的操作码有一个字节表示,所以最多可以有256条指令,当前虚拟机标准定义的指令数已经有200多条了

垃圾回收

垃圾回收算法

  • 复制算法
  • 标记清除算法
  • 标记整理算法
  • 分代收集算法

垃圾回收器

当前有7款垃圾收集器

垃圾收集器

  • 串行收集器有两款
    Serial和Serial Old分别用于收集新生代和老年代,特点是单线程

  • 并行收集器2款 Parallel Scavenge和Parallel Old分别用于收集新生代和老年代,特点是吞吐量优先,适用于不需要进行交互的任务,如只在后台运行的批处理任务

  • 剩下两款当前最常用的收集器ParNew和CMS,一般默认的这两款收集器 -XX:+UseConcMarkSweepGC参数开启CMS收集器,默认的新生代配合即是ParNew

类加载过程

加载->验证->准备->解析->初始化
verify->preapre->resolve这三个阶段称为链接阶段(link)

  • 类加载阶段classloader根据类的完全限定名读取class文件中的二进制数据
  • verify阶段对二进制数据进行验证
  • prepare阶段对静态变量赋零值,常量赋值
  • resolve阶段将常量池中的符号引用替换为直接引用
  • init阶段对静态变量赋值,执行static代码块,执行构造函数