JVM学习笔记

一、类加载器

1、类加载机制: 将class字节码文件加载到内存中,并且对其进行验证、准备和解析、初始化的工作,最终形成在内存中可以直接使用的数据类型


在这里插入图片描述

JVM将.class文件通过类加载器进行加载并初始化,得到Class类,然后通过构造器进行实例化对象存放到堆中


2、类加载器的分类: APP应用程序类加载器 --> Ext扩展类加载器 --> Boot启动类加载器

在这里插入图片描述

3、双亲委派机制: 类加载器收到类加载的请求,会把这个请求委托给父类加载器去加载,并一直委托直到启动类加载器,若其能加载成功,则成功返回;否则,子加载器会尝试去加载。

二、JVM内存结构

虚拟机栈: 保存八种基本数据类型的局部变量和对象的地址引用,线程私有

堆: 是GC执行垃圾回收的重点区域(OOM),线程共享,设置堆大小命令并打印:-Xms1024 -Xmx1024 -XX:+PrintGCDetails

三、JVM内存分区

新生代: Eden、幸存区1(from)和幸存区2(to)默认8:1:1,其中to和from相互转换,to区总为空;存活率低,使用复制算法

老年代: 标记清理或标记整理算法

为什么要分为新生代和老年代?
为了提高效率。根据对象的存活时间来看,有的对象寿命长,有的对象寿命短,将他们分别放置两个分区,并采用不同的垃圾收集算法,寿命长的清理频次少一些(标记清理或整理算法),寿命短的清理频次多一些(复制算法)

四、垃圾回收算法

可达性分析: 以根对象(GC Roots)为起始点,按照从上至下的方式搜索被根对象集合所连接的目标对象是否可达

1、标记清除法: 利用可达性去遍历内存,把存活的对象和垃圾对象进行标记,然后再遍历一次,把标记的垃圾对象进行回收(效率低,存在内存碎片)

2、标记整理法: 利用可达性去遍历内存,吧存活的对象和垃圾对象进行标记,然后把所有存活的对象向一段移动,将端边界以外的对象都回收掉(不会有内存碎片)

3、复制算法: 将内存按照容量大小分为大小相等的两块,每次只使用一块,当一块用完了,就将存活的对象移到另一块上,然后再把使用过的内存空间移除(内存使用率低,不会有内存碎片)

在这里插入图片描述

五、JVM一次完整的GC过程

新生代(1/3),老年代(2/3)

1、对象优先在Eden区分配,当Eden区没有足够空间时会进行一次Minor GC

2、执行完第一次MGC之后,存活的对象会被移动到Survivor(from)分区

3、Eden再次执行MGC,这时会采用复制算法,将Eden和from区一起清理,存活的对象被复制到to分区。移动一次,对象年龄加1,年龄大于一定阈值会直接移动到老年代(阈值设置:-XX:MaxTenuringThreshold)默认为15

4、Survivor区内存不足会发生担保分配,超过指定大小的对象可以直接进入老年代

5、当老年代内存不足的时候,会进行一次Full GC,清理整个内存堆(包括新生代和老年代)

六、CMS回收过程

1、初始标记(CMS initial mark): 主要是标记GC Root开始的下级对象,这个过程会(STW,Stop the world)

2、并发标记(CMS concurrent mark): 根据上一步的结果,继续向下标记所有关联的对象,直到这条链上的最尽头,这个过程为多线程,没有STW

3、重新标记(CMS remark): 再标记一次(其他线程在标识过程中,可能会产生新的垃圾)

4、并发清除(CMS concurrent sweep): 清理删除掉标记阶段判断的已经死亡的对象

导致问题: CPU资源紧张、无法清理浮动垃圾、并发失败、内存碎片问题

七、G1回收过程

1、初始标记(initial mark): 仅仅是标记GC Root能关联到的对象,但耗时很短,会STW

2、并发标记(concurrent mark): 从GC Root开始对堆中对象进行可达性分析,扫描整个堆,找出要回收的对象,耗时比较长;同时,还有重新处理在并发时有引用变动的对象

3、最终标记(final mark): 对用户线程做短暂的暂停,处理并发阶段结束后仍有引用变动的对象,会STW

4、清理阶段(live data count evacuation): 首先对各个Region的回收价值和成本进行排序,根据用户所期望的GC停顿时间来指定回收计划,然后再把要回收的Region的存活对象复制到空的Region中(会STW),最后清理整个旧Region的全部空间

在这里插入图片描述

八、GC Root 对象有哪些

虚拟机栈中引用的对象

方法区类静态属性引用的对象

方法区常量池引用的对象

本地方法栈JNT引用的对象

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值