什么是JVM?
JVM是java虚拟机的缩写 ,也是java程式可以实现跨平台的关键。
JVM部分需要知道什么东西?
JVM的结构和功能、参数配置、GC回收机制、GC回收器极其优缺点。
JVM结构(栈,程序计数器,方法区,栈)
从Java源码开始,JVM需要把源码转化为字节码,每个线程(包括主线程)都会产生一个虚拟机栈,里面会存储引用变量以及参数信息。程序计数器记录每个线程中执行的位置,当它遇到没见过的类时候,就会跑去对该类进行加载,将类的方法名,成员变量,注解等信息存储到方法区中。当该类被使用,new出对象,则将new的对象放到堆中。由此构建出JVM的结构,其中,程序计数器和栈是每个线程私有的,即多个线程时就会有多个对应的程序计数器和栈。而方法区和堆是共享且唯一的。
图中还包括解释器和即时编译器,解释器的作用是把字节码解释称CPU能识别的机器码,但是它是一条一条的解释,当有循环时,它会把循环中的内容一遍一遍的解释,故此会影响效率。此时即时编译器就发挥了它的作用,它把这些循环重复多次的语句存储,避免解释器反复解释。
GC回收
GC回收是指对内存中不再使用的对象进行清除的操作,把它们的资源释放出来。
GC回收原理是通过可达性算法和三色标记法配合,根据算法找到根对象,然后沿着根对象找与之相关的对象,使用黑灰白三色标记,将已经标记的表示为黑色,正在标记的表示为灰色,未标记的表示为白色。最终检查完后,将所有白色的进行清除。
GC回收机制有三种方法:
1.标记清除法
2.标记整理法
3.标记复制法
由上述解释可知,所谓标记,是将正在使用的对象进行标记,标记清除法的意思就是将未标记的进行清除,它的优点是快速,缺点就是,会形成内存碎片,因为没发保证正在使用的都是连续的。而标记整理法,是在标记清除法上加了一个整理的步骤,将不连续的区域整理成连续的。因此它解决了标记清除法产生内存碎片的问题,但是它的缺点就是会导致速度不如前者。于是产生了第三种标记复制法,它会产生两个内存区,“from”和“to”,它会把所有标记的内容复制到to区上,复制完后,就把原本的区域全部清除掉,清除完之后,会把from区和to区调换位置,后续操作依次。它解决了标记清除法和标记整理法的缺点,但是它的缺点是需要多一块区域,会比另外两个方法多占用内存资源。
标记清除法,现在的GC垃圾回收器都已经没有使用了。
标记整理法,常用于老年代。
标记复制法,常用于新生代。
上述提到两个新名词,老年代和新生代,这两个区都在堆中。其中新生代又划分为eden区和Survivor区(默认eden区和Survivor区大小比例为八比一,Survivor区包含两个区域,一个叫“from”一个叫“to”),所有新new的对象都会先在eden区创建,当eden区堆积满了之后,做垃圾回收,会把还存在的对象放入Survivor,当Survivor经过多次垃圾回收,依旧存在的对象就会进入老年代(默认操作15次)。因为新生代朝生暮死,大多数生命周期短,因此可以减少复制使用到的空间,故而标记复制法适用于新生代。又因为老年代默认为生命周期长,而且标记整理法中整理部分比较耗费时间,但是老年代的垃圾回收频率会低很多,故而老年代使用的是比较耗费时间的标记整理法。
垃圾回收器包括:Parallel GC、Concurrent Mark Sweep GC、G1 GC。
Paarllel GC:注重的是吞吐量。
Concurrent Mark Sweep GC:注重响应速度。
G1 GC:兼容吞吐量和响应速度。
上述不够完整,持续维护中……