写点什么

第九周 性能优化 (三) 课后作业

用户头像
简简单单
关注
发布于: 2021 年 01 月 24 日
第九周 性能优化(三)课后作业
  • 请简述 JVM 垃圾回收原理。

1、辨别对象无效方法

主要引用计数法与可达性分析来标记无效对象。

2 垃圾回收方法

2.1 清除

把死亡对象占据的内存标记为空闲对象,并记录在一个空闲列表之中.要新建对象时,就把这些空间分配给新的对象.

缺点,会造成内存碎片.

2.2 压缩

把存活的对象聚集到内存区域的起始位置.

缺点,压缩算法的开销.

2.3 复制

把内存区域分成两份,分别用两个指针 from, to 来处理.当发生对象回收时,将存活的对象从 from 复制到 to 的区域,然后交换 from 和 to 的指针.

缺点,堆空间使用效率低下.

3 java 虚拟机的划分


java 虚拟机垃圾分代基于的基本假设-大部分对象只存活一小段时间,小部分对象存活很长时间.


  • 新生代-老年代

  • 新生代又分为 Eden 区和两个大小相同的 Survivor 区(from;to)

  • 当调用 new 指令时,会在 Eden 划分出一块区域.当 Eden 区域内存满了,Java 此时会开始做 Young GC 也叫 Minor GC 收集新生代垃圾.

  • 生存下来的对象会被送到 Survivor 区.

  • 发生 Minor GC 时,Survivor 区的存活对象也会被从 from 移到 to 区.并交换 from 和 to 的指针.

  • Survivor 区的对象被来回复制超过 15 次以后,就会被送到老年代.

  • 如果单个 Survivor 区的内存使用量超过 50%,较高复制次数的对象也会被晋升至老年代.

  • TLAB(Thread Local Allocation Buffer)-这个技术是用于解决多线程竞争堆内存分配问题的,核心原理是对分配一些连续的内存空间

  • 如果老年代的对象引用了新生代的对象,那么这个引用也会被加入到 GC Roots 中.这会导致全堆扫描

  • 如何应对全堆扫描-卡表,大致地标出可能存在老年代到新生代引用的内存区域

以下是来及回收的过程图:


发布于: 2021 年 01 月 24 日阅读数: 14
用户头像

简简单单

关注

还未添加个人签名 2018.01.22 加入

还未添加个人简介

评论

发布
暂无评论
第九周 性能优化(三)课后作业