概述
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代码块,执行构造函数