类加载机制
类的生命周期:加载,链接,初始化,使用,卸载
类加载器:(待补充)
双亲委派模型:当类加载器试图加在某个类时,尽量将任务代理给当前加载器的父加载器去做,目的是为了避免重复加载java类型
JVM内存结构
jvm内存模型:
堆(线程共享):对象
方法区(线程共享):静态变量+常量+方法区,具体实现是matadata
栈(线程私有):局部变量
本地方法栈(线程私有):
程序计数器(线程私有):
对象分配规则
对象优先分配在Eden区,如果Eden区没有足够的空间时,虚拟机执行一次Minor GC。 长期存活的对象进入老年代。虚拟机为每个对象定义了一个年龄计数器,如果对象经过了1次Minor GC那么对象会进入Survivor区,之后每经过一次Minor GC那么对象的年龄加1,知道达到阀值(默认15)对象进入老年 区。每次进行Minor GC时,JVM会计算Survivor区移至老年区的对象的平均大小,如果这个值大于老年区的剩余值大小则进行一次Full GC,
内存占比:
新生代(占1/3堆空间):伊甸园80%,幸存者20%
老年代(占2/3堆空间):15次gc放到
线程间通信:
1,线程a把本地内存中更新过的共享变量刷新到主内存中去
2,线程b去主线程读取线程a更新过的共享变量
判断一个对象是否存活:
引用计数法,每个对象一个引用计数器,每有个地方引用此对象,计数器就加一,引用失效减一,引用为零将会被回收
可达性算法(引用链):(待补充)
常见gc算法:
标记清除算法:算法分为标记和清除两个阶段,首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象
复制算法:将内存按容量分为相等的两份,每次使用其中一份,当这份内存用完了,就将存活的对象复制到另一块内存上面,然后吧使用过的内存清除掉
标记-压缩算法:过程与标记清楚算法类似,区别是所有存活的对象向另一端移动,然后清理端边界以外的内存
分代收集算法:java的堆分为新生代和老生代,不同代采用合适的算法
jvm调优:
就是尽量减少gc出现