一 jvm运行原理
1.JVM是可运行java代码的假想计算机,包括一套字节码指令集,一组寄存器,一个栈,一个垃圾回收,堆,和一个存储方法域。
2.在虚拟机上是无法直接运行.java文件,因为虚拟机不能识别.java文件。在虚拟机运行之前需要先将.java文件用编译器生成.class文件,即生成字节码文件。.class是可以被虚拟机识别并运行的。所以虚拟机运行的是编译器生成的.class文件,而不是.java文件本身。
二 jvm的内存结构
根据jvm规范,可以将jvm的内存分为六个区域:
PC寄存器(即程序计数器),方法区,堆区,虚拟机栈,本地方法栈,常量池
2.1 程序寄存器
即PC寄存器,是一个很小的内存区域。用来存储字节码行号,程序的推进就是通过更改程序计数器的的值读取下一条要执行的指令。
2.2方法区
存放了要加载的类,静态变量,构造函数,final定义的常量,类中的方法和字段等信息。GC也会在此执行,只是很少。超出内存时会抛出异常。
2.3堆区
Gc最频繁的区域,堆区由所有线程共享,在虚拟机启动时创建。主要存放对象实例及数组,以及所有new出来的对象。
2.4虚拟机栈
占用的是操作系统的内存,每个线程对应一个虚拟机栈,它是线程私有的,随着线程的创建而创建,随着线程的消失而消失,用来存放局部变量,动态链接,操作数和方法出口信息等等。
2.5本地方法栈
用于支持native方法的执行,与虚拟机栈的机制一致。唯一的区别是虚拟机栈执行java方法本地方法栈执行native方法。
2.6常量池
常量池在java用于保存在编译期已确定的,已编译的class文件中的一份数据。它包括了关于类,方法,接口等中的常量,也包括字符串常量,如String s = "java"这种申明方式;当然也可扩充,执行器产生的常量也会放入常量池,故认为常量池是JVM的一块特殊的内存空间。
三 Gc机制(垃圾回收机制)
随着程序的运行,内存中的实例对象及变量等占据的内存越来越多。如果不及时进行回收,将使得程序运行的几率底下甚至系统的异常。在上述的五个区域中,程序计数器和虚拟机栈以及本地方法栈随着程序的生命周期自动销毁,堆区以及方法区需要对那些不存在任何引用的对象,变量等等垃圾进行处理。