jvm

类加载机制

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

类加载器:(待补充)

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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • http://www.cnblogs.com/angeldevil/p/3801189.html值得一看 Clas...
    snail_knight阅读 5,410评论 1 0
  • JVM架构 当一个程序启动之前,它的class会被类装载器装入方法区(Permanent区),执行引擎读取方法区的...
    cocohaifang阅读 5,697评论 0 7
  • 这篇文章是我之前翻阅了不少的书籍以及从网络上收集的一些资料的整理,因此不免有一些不准确的地方,同时不同JDK版本的...
    高广超阅读 15,973评论 3 83
  • 介绍JVM中7个区域,然后把每个区域可能造成内存的溢出的情况说明 程序计数器:看做当前线程所执行的字节码行号指示器...
    jemmm阅读 6,680评论 0 9
  • 内存溢出和内存泄漏的区别 内存溢出:out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,...
    Aimerwhy阅读 4,090评论 0 1

友情链接更多精彩内容