Java 堆是垃圾收集器管理的主要区域,因此也被称作GC 堆(Garbage Collected Heap)
引用计数法
给对象中添加一个引用计数器,每当有一个地方引用它,计数器就加 1;当引用失效,计数器就减 1;任何时候计数器为 0 的对象就是不可能再被使用的。
这个方法实现简单,效率高,但是目前主流的虚拟机中并没有选择这个算法来管理内存,其最主要的原因是它很难解决对象之间相互循环引用的问题。

可达性分析算法
这个算法的基本思想就是通过一系列的称为 “GC Roots” 的对象作为起点,从这些节点开始向下搜索,节点所走过的路径称为引用链,当一个对象到 GC Roots 没有任何引用链相连的话,则证明此对象是不可用的,需要被回收。
下图中的 Object 6 ~ Object 10 之间虽有引用关系,但它们到 GC Roots 不可达,因此为需要被回收的对象。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I8KteIf9-1663585354114)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/07cca0a4-6a62-4d17-a36c-0aa8a7b4cfdf/Untitled.png)]](https://1000bd.com/contentImg/2024/09/14/0976b018d544deba.png)
哪些对象可以作为 GC Roots 呢?
对象可以被回收,就代表一定会被回收吗?
即使在可达性分析法中不可达的对象,也并非是“非死不可”的,这时候它们暂时处于“缓刑阶段”,要真正宣告一个对象死亡,至少要经历两次标记过程;可达性分析法中不可达的对象被第一次标记并且进行一次筛选,筛选的条件是此对象是否有必要执行 finalize 方法。当对象没有覆盖 finalize 方法,或 finalize 方法已经被虚拟机调用过时,虚拟机将这两种情况视为没有必要执行。
被判定为需要执行的对象将会被放在一个队列中进行第二次标记,除非这个对象与引用链上的任何一个对象建立关联,否则就会被真的回收。
四种引用
强引用、软引用、弱引用、虚引用、终结器应用
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8mxnfuJ3-1663585354115)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/82ad3f17-0bb8-41cc-bed6-4b13b42a782f/Untitled.png)]](https://1000bd.com/contentImg/2024/09/14/61a3937a0f45cbbd.png)
强引用:只有所有GC Roots对象都不通过【强引用】引用该对象,该对象才能被垃圾回收;
软引用:
弱引用:
虚引用:
终结器引用
标记清除
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vRNQJj4V-1663585354116)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/c73a295e-77fb-4f38-b8f1-dbe6617757ed/Untitled.png)]](https://1000bd.com/contentImg/2024/09/14/7614489480afee73.png)
标记整理

复制
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5ot9auJT-1663585354119)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/894f0769-e215-4080-b4fb-3a9b425b57e4/Untitled.png)]](https://1000bd.com/contentImg/2024/09/14/197407808f48c4ad.png)
总结:
标记清除
标记整理
复制
现在收集器基本都采用分代垃圾收集算法
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lZgF2UE3-1663585354120)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/bc75a4a6-5aa0-45e0-a20b-e9de9267f03e/Untitled.png)]](https://1000bd.com/contentImg/2024/09/14/13eb06e66549d7d2.png)
相关VM参数
| 参数 | 含义 |
|---|---|
| 堆初始化 | -Xms |
| 堆最大大小 | -Xmx 或 -XX:MaxHeapSize=size |
| 新生代大小 | -Xmn 或 (-XX:NewSize=size + -XX:MaxNewSize=size ) |
| 幸存区比例(动态) | -XX:InitialSurvivorRatio=ratio 和 -XX:+UseAdaptiveSizePolicy |
| 幸存区比例 | -XX:SurvivorRatio=ratio |
| 晋升阈值 | -XX:MaxTenuringThreshold=threshold |
| 晋升详情 | -XX:+PrintTenuringDistribution |
| GC详情 | -XX:+PrintGCDetails -verbose:gc |
| FullGC 前 MinorGC | -XX:+ScavengeBeforeFullGC |
串行
-XX:+UseSerialGC=Serial+SerialOld

吞吐量优先
-XX:+UseParallelGC ~ -XX:+UseParallel0ldGC
-XX:+UseAdaptiveSizePolicy
-XX:GCTimeRatio=ratio
-XX:MaxGCPauseMillis=ms
-XX:ParallelGCThreads=n

响应时间优先
XX:+UseConcMarkSweepGC ~ -XX:+UseParNewGC ~ Serial0ld
-XX:ParallelGCThreads=n ~-XX:ConcGCThreads=threads
-XX:CMSInitiatingOccupancyFraction=percent
-XX:+CMSScavengeBeforeRemark

G1
定义:Garbage First
…
略(以后再补充)
预备知识:
调优领域
确定目标
最快的GC是不发生GC
查看FullGC前后的内存占用,考虑下面几个问题
新生代调优
新生代的特点:
·越大越好吗?
-Xmn
Sets the initial and maximum size (in bytes) of the heap for the young generation (nursery).GC is performed in this region more often than in other regions. If the size for the young generation is too small, then a lot of minor garbage collections are performed. If the size is too large, then only full garbage collections are performed, which can take a long time to complete. Oracle recommends that you keep the size for the young generation greater than 25% and less than 50% of the overall heap size.
新生代能容纳所有【并发量*(请求-响应)】的数据
幸存区大到能保留【当前活跃对象+需要晋升对象】
晋升阈值配置得当,让长时间存活对象尽快晋升
-XX:MaxTenuringThreshold=threshold
-XX:+PrintTenuringDistribution
Desired survivor size 48286924 bytes, new threshold 10 (max 10)
…
老年代调优
以CMS为例
案例: