让建站和SEO变得简单

让不懂建站的用户快速建站,让会建站的提高建站效率!

深入理解java垃圾回收


发布日期:2022-04-24 15:12    点击次数:60


说到垃圾回收(Garbage Collection,GC),很众人就会自然而然地把它和Java相干首来。在Java中,程序员不需求往关心内存动态分配和垃圾回收的题目,这类似都交给了JVM来处理。

1.为什么Java中需求垃圾搜集?

在很众编程措辞中,如C和C++,当程序不再需求对象时,开发人员必须采取编程步骤来回收对象在内存等分配的任何空间。

如果实施得当,这栽手腕可以大略会特别有效。然而,历史已经外明,当这个过程做得不益时,可以大略会发生内存泄漏并导致行使程序停业。

当Java措辞被创建时,Sun工程师决定开发人员不该该负责管理他们创建的对象所动使的内存。相逆,垃圾搜集例程将是JVM的一单方;此例程识别不再动使的对象,并将其从内存中删除。

2.Java对象何时可用于垃圾搜集?

当对象被标记为null、超出界限或不再被行使程序中的任何非null对象引用时,它就可以大略进动垃圾搜集。轻盈来说,当行使程序不再动使Java对象时,它就可以大略进动垃圾搜集。

3.标记和扫描是什么兴趣?

可以大略将Java中的垃圾搜集分为两个紧要阶段。第一个阶段是标记阶段,JVM查望内存中的每个对象,并确定是否照旧需求它。如果不需求该对象,则将其标记为垃圾搜集。

扫描是第二阶段,JVM在该阶段实动垃圾搜集和内存回收。

采用这栽事件序列的垃圾搜集算法称为标记和扫描垃圾搜集器。

4.什么是分代垃圾回收?

JVM将分配的内存拆分为四个独力的空间:eden、survivor、tenured、metaspace。

底层JVM组件(如字符串缓冲区和编译类)在元空间等分配内存。随着时间的推移,这个空间相对不变。当人们谈论垃圾搜集时,重点一般是eden、survivor和tenured。

第一次创建对象时,它会被安顿在eden空间中。如果垃圾回收发生,并且对象照旧被引用,它将被移动到survivor空间。如果发生了充沛众的垃圾搜集,并且survivor空间中的某个对象从未被搜集,那么它将被移动到tenured空间。

eden、survivor和tenured空间都是单独搜集垃圾的,其中eden搜集最众,tenured空间搜集最少。这有助于挑高性能,由于弱世代伪如知照照顾俺们,长寿命对象可以大略会保持活动状态,以是检查其垃圾搜集资格是铺张时间。

此外,eden空间中的对象更有可以大略是短暂的,并且有资格被移除,以是扫描eden空间更有可以大略开释出大量内存。

将垃圾搜集器划分为eden、survivor、Tentered和metaspace区域,可以大略极大地挑高JVM性能。

5.Java内存泄漏如何影响垃圾搜集?

内存泄漏会补充内存践踏,JVM被迫更屡次地疏通,以便为新对象修整空间。垃圾搜集例程将更屡次地疏通,每次疏通时开释的内存会更少,直到结尾别国结余的堆空间。

6.什么时候会选择并动垃圾搜集器(GC)而不是并发标记扫描(CMS)或G1垃圾搜集器?

G1垃圾搜集器在编制可以大略向堆分配大量内存时办事得最益。

在不影反映用程序性能的情况下,动使CMS处理和垃圾搜集例程。对于大幼幼于32GB的堆,它也最有效。

如果一个编制别国大量专用于堆的内存或有余的处理能力来分配给CMS,那么轻盈的并动GC是无误的选择。

此外,与其他算法相比,并动GC一般会在给定的时间段内搜集更众的垃圾。如果苏息时间不是题目,那么并动垃圾搜集可以大略是最佳选择。

如果对垃圾回收动为较为敏感,那么深入知道垃圾回收的原则(以及它在 JVM 中是如何实现的)对于开发人员来说会很有协助。