JVM基础结构(运行时数据区)
JVM是运行在内存中的,因为速度足够快。
JVM线程私有部分异常
程序计数器内存不会溢出:程序计数器是一个int类型的值,指向当前线程正在运行的字节码的行号,占用小不会溢出
虚拟机栈会溢出,在递归过程中深度超过限定深度,抛出StackOverflow
JMM(JVM内存模型)
JAVA中的对象回收,作为GC Roots的对象包括:
1.虚拟机栈(本地变量表)中引用的对象。
2.方法区:类静态属性引用的对象。
3.方法区:常量引用的对象。
通过可达性分析算法,计算是否能被GC roots引用,不被引用则回收。
GC发生在新生代,存活对象会在F-S、T-S两个交换区中反复交换,每次GC年龄增加。
动态对象年龄判定:存活区放不下的时候,存活对象直接进入老年代。
空间担保:
在发生minor gc之前,虚拟机会检测 : 老年代最大可用的连续空间>新生代all对象总空间?
1、满足,minor gc是安全的,可以进行minor gc。
2、不满足,虚拟机查看HandlePromotionFailure参数:
(1)为true,允许担保失败,会继续检测老年代最大可用的连续空间>历次晋升到老年代对象的平均大小。若大 于,将尝试进行一次minor gc,若失败,则重新进行一次full gc。
(2)为false,则不允许冒险,要进行full gc(对老年代进行gc)。
Minor GC为什么需要两块小的区域?而不是直接把新生代直接分为50%?
因为90%的对象都不需要回收,只有10%的对象需要回收。
FULL GC会导致JVM全停止,减少FULL GC的次数能有效提高效率。