JVM
什么是JVM
JVM java虚拟机。编译运行JAVA程序的东西。由于系统的问题,软件不能通用。而对于java程序来说,jvm会把java源文件编译为字节码文件。再将字节码文件解析为与系统相对应的机器码文件。由此实现java程序的跨平台性。实际上目前jvm只是按照java的解析规范识别字节码文件,所以被称之为java虚拟机。如果能让jvm按照其他语言的解析规范,比如php,去解析字节码文件。那么也可以实现php的跨平台性。
JVM执行class文件的过程
加载,验证,准备,解析,初始化,使用,卸载
JVM类加载机制
JVM加载顺序大体上可以是
父类静态资源
子类静态资源
父类构造方法
子类构造方法
实际上在准备阶段的时候JVM就会对类变量进行内存分配及初始化,但这里的初始化值并不是用户定义的或所希望的值而是java语言中该变量类型的零值。如定义 static int i = 3;在准备阶段会初始化i=0;在初始化阶段才会赋值为3;
而初始化阶段。jvm会首先收集类变量赋值语句,静态代码块构成类初始化方法。然后收集成员变量赋值语句,普通代码块,最后收集构造方法构成对象初始化方法。由此决定类各个属性及方法的加载顺序。
JVM内存结构
jvm内存可以分为两类,一类是线程公有的。一类是线程私有的。
线程公有
堆,方法区,常量池。
堆中又分为新生代和老年代。新生代分为Eden、from survivor 0,、to survivor 1;
其中 Eden:from:to = 8:1:1。
线程私有
pc寄存器,虚拟机栈,本地方法栈。