深入理解 Java 垃圾回收机制

时间:2019-07-24 来源: 国内新闻

Java语言的一个显着特征是引入了Java回收机制,这是C ++程序员最麻烦的内存管理问题。它使Java程序员在编写程序时不考虑内存管理。由于存在垃圾收集机制,因此java中的对象没有“范围”的概念,只有对象的引用具有“范围”。垃圾收集可以有效地防止内存泄漏并有效地使用空闲内存;

内存泄漏:指内存空间在使用后不回收,在一般情况下不涉及复杂的数据结构,java内存泄漏作为内存对象的生命周期超出了程序所需的时间长度,我们也称之为“无对象”;

f6e6b61c99644697a97f04666fe79dfa

第二,哪些内存需要回收?

或者换一种说法如何确定资源是否不再被使用(“死”)。

第一种方法,引用计数。这似乎是一个非常古老的方法,现在JVM不应该使用它。引用计数是每个对象被引用的次数。当引用数变为0时,它是无用的并且可以清理。这个问题的缺点是什么?显然,如果A指的是B而B指的是A,这个循环引用会引起麻烦,因为A和B的引用数永远不会变为0,但A和B可能没用。

链接,递归确定可到达的对象。如果对象不能从这些根对象中的一个(至少一个)到达,则它是垃圾收集的。在对象遍历阶段,GC必须记住可以到达哪些对象以删除不可到达的对象,这称为标记对象。

7f092ff152c84ff4a93dfff52f76ebf1

三,如何回收

放着不管肯定是不行的,因为这涉及到JVM分配内存的问题的.java在堆中分配对象,在一些语言中,在堆上分配对象的代价十分高昂,但是,java的不是这样,JAVA从堆分配空间的速度可以和其他语言从堆栈上分配空间的速度相媲美.Java能做到这个就和它的内存回收机制有关系。拿在java的比喻中,java中堆的实现像一个传送带,没分配一个新对象,他就往前移动到一格。这个就必须保证内存的紧凑,不能出现太多的内存片段。所以JVM在回收垃圾的时候,必须做一些其他工作,保证这个紧凑性。

第一个方法:停止和复制这种收集器将堆栈分为两个域,常称为半空间每次仅使用一半的空间,JVM生成的新对象则放在另一半空间中。 GC运行时,它把可到达对象复制到另一半空间,从而压缩了堆栈。这种方法适用于短生存期的对象,持续复制长生存期的对象则导致效率降低。并且对于指定大小堆来说,需要两倍大小的内存,因为任何时候都只使用其中的一半。注意,在执行这一操作的时候,要先暂停程序的运行。

第二个方法:马克 - 清除它依据的思路同样是从堆栈和静态存储区出发,遍历所有的引用,进而找到所有存活对象每当它找到一个存活对象,就会给对象设一个标记,这个过程不会回收任何对象。只有全部标记工作完成的时候,清理动作才开始。在清理的过程中,没有标记的对象将被释放,不会发生任何复制动作。所以剩下的堆空间是不连续的,垃圾回收期要是希望得到连续空间的话,就得重新整理剩下的对象.mark - 清除也要在程序暂停的情况下才能进行。

XX338ce0b826704f428abc8b9e2071d737

第三,增量收集器。增量收集器将堆栈划分为多个域,一次只从一个域收集垃圾。还可以理解为将堆栈分成小块和一个垃圾,并且一次只收集一个块的垃圾。这可能导致应用程序停机时间较短,因此用户通常不会意识到垃圾收集器正在运行。

第四,世代收藏家。复制收集器的缺点是每次收集时都会复制所有标记对象,导致一些具有长生命周期的对象被多次来回复制,这会消耗大量时间。世代收藏家解决了这个问题。分代收集器将堆栈分成两个或多个域来存储不同生命周期的对象。 JVM生成的新对象通常放在其中一个域中。随着时间的推移,将使用继续存在的对象(非短期对象),并将其转移到寿命较长的域。分代收集器对不同的域使用不同的算法来优化性能。

五,并行收藏家。并行收集器使用一些传统算法并使用多个线程并行执行其工作。在多CPU机器上使用多线程技术可以显着提高Java应用程序的可伸缩性

四,GC(垃圾收集器)

新一代收集器使用的收集器:Serial,PraNew,Parallel Scavenge

旧收藏家使用的收藏家:Serial Old,Parallel Old,CMS

4fe89907c15746f0b8ccae53542bd185

串行收集器(复制算法)

标记和清洁的新一代单线程收集器是单线程的,其优点是简单而有效。

串行旧收集器(标签整理算法)

老式单线程收集器,串口收集器的老版本。

ParNew收集器(停止复制算法)

新一代收集器可以被视为串行收集器的多线程版本,在多核CPU环境中具有比串行更好的性能。

Parallel Scavenge Collector(停止复制算法)

并行收集器追求高吞吐量和高效的CPU利用率。吞吐量通常为99%,吞吐量=用户线程时间/(用户线程时间+ GC线程时间)。它适用于不需要高交互的后台应用程序等场景。

并行旧收集器(停止复制算法)

旧版本的Parallel Scavenge收集器,并行收集器,吞吐量优先级

CMS(并行标记扫描)收集器(标记清理算法)

高并发,低暂停,追求最短GC恢复暂停时间,cpu占用率相对较高,响应时间快,暂停时间短,多核cpu追求高响应时间选择

a7ae52f7b31f47a1976ce63beb7700a7

五,GC的实施机制

因为对象是分阶段处理的,所以垃圾收集区域和时间是不同的。 GC有两种类型:Scavenge GC和Full GC。

清除GC

通常,当生成新对象并且Eden应用程序空间失败时,将触发Scavenge GC,Eden区域为GCd,清除不可行对象,并将幸存对象移动到Survivor区域。然后组织幸存者的两个区域。以这种方式进行的GC是在年轻一代的伊甸园地区进行的,不会影响老一代。因为大多数物体都是从伊甸园区域开始的,并且伊甸园区域没有分配很多,所以伊甸园区域的GC将会频繁出现。因此,通常需要使用快速有效的算法使Eden尽快自由。

完整的GC

组织整个堆,包括Young,Tenured和Perm。 Full GC比Scavenge GC慢,因为它需要回收整个堆,因此应尽可能减少Full GC的数量。在调整JVM的过程中,很大一部分工作是调整FullGC。 Full GC可能由以下原因引起:

老一代(终身)已经满了

2.持续生成(Perm)已填满

3.System.gc()显示为

4.最后一次GC后Heap域分配策略的动态变化

频道热点
新闻排行
  1.   倪叔的思考暗时间昨天我要分享  Oculus联合创始人麦考利称,他认为虚拟现实游戏没有有真正的市场。如

      倪叔的思考暗时间昨天我要分享  Oculus联合创始人麦考利称,他认为虚拟现实游戏没有有真正的市场。如...

  2. 招聘2万名国家公务员尚未开始。在申请考试之前,许多小伙伴对专业申请的要求存有疑虑。关于专业性的一些问?

    招聘2万名国家公务员尚未开始。在申请考试之前,许多小伙伴对专业申请的要求存有疑虑。关于专业性的一些问?...

  3. 招聘2万名国家公务员尚未开始。在申请考试之前,许多小伙伴对专业申请的要求存有疑虑。关于专业性的一些问?

    招聘2万名国家公务员尚未开始。在申请考试之前,许多小伙伴对专业申请的要求存有疑虑。关于专业性的一些问?...

  4.   倪叔的思考暗时间昨天我要分享  Oculus联合创始人麦考利称,他认为虚拟现实游戏没有有真正的市场。如

      倪叔的思考暗时间昨天我要分享  Oculus联合创始人麦考利称,他认为虚拟现实游戏没有有真正的市场。如...

  5. 这是一个扒手的季节。很多朋友一直想改变他们的旧机器。我一直无法找个假期去度暑假。我可以公然选择我最喜

    这是一个扒手的季节。很多朋友一直想改变他们的旧机器。我一直无法找个假期去度暑假。我可以公然选择我最喜...

  6. 7月2日,吉首大学品牌活动“立人读书沙龙”,吉首大学原校级主管,着名文化学者张建勇微信征文集《行走的树

    7月2日,吉首大学品牌活动“立人读书沙龙”,吉首大学原校级主管,着名文化学者张建勇微信征文集《行走的树...

  7. 7月2日,吉首大学品牌活动“立人读书沙龙”,吉首大学原校级主管,着名文化学者张建勇微信征文集《行走的树

    7月2日,吉首大学品牌活动“立人读书沙龙”,吉首大学原校级主管,着名文化学者张建勇微信征文集《行走的树...

  8. 这是一个扒手的季节。很多朋友一直想改变他们的旧机器。我一直无法找个假期去度暑假。我可以公然选择我最喜

    这是一个扒手的季节。很多朋友一直想改变他们的旧机器。我一直无法找个假期去度暑假。我可以公然选择我最喜...

  9. 7月2日,吉首大学品牌活动“立人读书沙龙”,吉首大学原校级主管,着名文化学者张建勇微信征文集《行走的树

    7月2日,吉首大学品牌活动“立人读书沙龙”,吉首大学原校级主管,着名文化学者张建勇微信征文集《行走的树...

  10.     当许多养牛新手第一次接触这个行业时,他们对养牛有关的经验和技能基本上是空白的。如何在购买和饲

        当许多养牛新手第一次接触这个行业时,他们对养牛有关的经验和技能基本上是空白的。如何在购买和饲...

日期归档
友情链接