JVM 9大醉成部分,但重点是堆和GC
java栈和GC有意义,其他了解即可
堆、栈、方法区的关系
堆
堆这一块区域,分为新生代和老生代两块区域。划分的依据是实例化的对象经过的GC的次数。
新生代分为eden、from、to 或者说 eden、s0,s1区,s0,s1大小相等并且可以相互转换角色(结合垃圾回收机制的复制算法理解)。过程:刚被实例化存在eden,经过一次GC后如果对象还存活,还被使用,该对象进入s0或s1区(所有对象要么在s0,要么在s1),之后每经过一次GC,年龄加1,当经过一定次数GC后(默认是15次)进入老年代。
s0,s1大小相等并且可以相互转换角色的理解(结合垃圾回收机制的复制算法理解)
复制只对s0和s1区域,不是eden
栈
线程私有的内存空间(对一个有很多类和方法组成的复杂程序,从全局来看,栈是运行过程中的临时变量和数据)
栈由三部分构成,局部变量表、操作数栈和帧数据区。了解,没必要专门看。
方法区
方法区式一块所有线程共享的内存区(和栈一样),保存系统的类信息(类的定义、方法,常量等)。
方法区的大小决定了系统可以保存多少类,定义类太多会导致方法区溢出,JVM抛出内存溢出错误。 但是一般不用考虑,足够用。
垃圾回收机制算法
1、引用计数法
对象被其他引用时计数器加1,引用失效时减1,缺点:无法处理循环引用(循环引用时有bug)、并且加减操作浪费系统性能。
2、标记清除法
对象操作分为标记和清除两个阶段,先对要清除的对象标记,再进行清除,但清除并不一定能玩出干净,留下碎片。缺点:空间碎片化不连续。
3、复制算法(用在新生代):将内存空间分为两块,每次使用一块,需要回收的时候,将还存活使用的对象复制到另外一块去,将当前内存块清空即可。两块内训块交替使用。
4、标记整理法(老年代使用):在标记清除法优化,把需要清理的对象标记出来,把存活的对象压缩到内存的一段,而后再清理。
老年代和新生代使用不同的算法:
新生代对象GC频繁(对象死的快,存活的少)清除的对象多:
老年代对象存活的概率比较高,清除对象少:
新生代、老年代使用不同特点算法,使内存操作最小化来提高整个JVM性能。
其他:
5、分代回收算法:内存分为多块,不同内存区域采用不同的回收算法,一般区分老年代和新生代。目前用的就是。
垃圾回收时的停顿现象;
系统会进入停顿,瞬间终止所有线程,保证垃圾回收高高效执行。一是终止所有线程才不会有新的垃圾产生。二是保证了系统状态在该瞬间的一致性。
《深入理解Java虚拟机》--阅读笔记(思维导图,干货收好)https://blog.csdn.net/iemdm1110/article/details/53301192
JVM基础面试题及原理讲解 http://www.importnew.com/31126.html