大数据相关技术

jvm

2019-08-13  本文已影响0人  ThomasAAnderson

类加载机制

类的生命周期:加载,链接,初始化,使用,卸载

类加载器:(待补充)

双亲委派模型:当类加载器试图加在某个类时,尽量将任务代理给当前加载器的父加载器去做,目的是为了避免重复加载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出现

上一篇 下一篇

猜你喜欢

热点阅读