1、jvm是一种规范,vm指虚拟机,符合规范的就是jvm。2010年oracle收购了sun,将主要使用hotspot这个虚拟机。有些公司有自己的虚拟机,如IBM,用来运行自己内部程序。一个Java应用对应一个Java虚拟机,既有几个main函数就有几个虚拟机。
2、jvm基本结构:
1、只要有非守护线程存在,虚拟机就会一直运行,gc是守护线程。守护进程里new出来的进程也是守护进程。
2、jvm运行过程:1、找到main方法所在的类,通过类加载器把该类的信息加载到方法区(permanent区),
类的信息有:
注:字段信息存的是成员变量,如private int i;静态变量储存在5.类变量中。常量池里都是final修饰的变量,main方法也在方法区里。当main方法里调用一个方法时,就会把方法放入帧 并压入Java栈。
本地方法:是指操作系统自带的方法。如window操作系统自带的一些底层方法。
任何本地方法接口都会使用某种本地方法栈。当线程调用Java方法时,虚拟机会创建一个新的栈帧并压入Java栈。然而当它调用的是本地方法时,虚拟机会保持Java栈不变,不再在线程的Java栈中压入新的帧,虚拟机只是简单地动态连接并直接调用指定的本地方法
3、基本类型变量,引用变量都存储在栈中,没有默认值。但是数组是在堆中分配内存的,有默认值。
4、多线程相关:保证数据同步的方式,volatile和synchronize和final。指令重排,jvm提高性能的一种方式。如:a=2;b=3;交换执行顺序是没有关系的。多线程之间jvm不会考虑有序,想要有序只能synchronize修饰方法。
5、jvm对字节码有两种执行方式,1、是解释执行,2、是编译成机器码直接执行。(比第一种快10倍)
6、总结:首先,当一个程序启动之前,它的class会被类装载器装入方法区(不好听,其实这个区我喜欢叫做Permanent区),执行引擎读取方法区的字节码自适应解析,边解析就边运行(其中一种方式),然后pc寄存器指向了main函数所在位置,虚拟机开始为main函数在java栈中预留一个栈帧(每个方法都对应一个栈帧),然后开始跑main函数,main函数里的代码被执行引擎映射成本地操作系统里相应的实现,然后调用本地方法接口,本地方法运行的时候,操纵系统会为本地方法分配本地方法栈,用来储存一些临时变量,然后运行本地方法,调用操作系统APIi等等。