ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

JVM理解2

2022-08-28 01:31:28  阅读:188  来源: 互联网

标签:收集器 对象 回收 理解 GC 引用 JVM 垃圾


1、垃圾回收(GC)

GC(Garbage Collection,即垃圾回收)的基本原理:将内存中不再被使用的对象进行回收。垃圾回收主要是发生在堆内存里面,在1.8以后FULLGC也会发生在meta space中。

  • 对新生代的对象的收集称为minor GC。Minor GC指新生代GC,即发生在新生代(包括Eden区和Survivor区)的垃圾回收操作,当新生代无法为新生对象分配内存空间的时候,会触发Minor GC。因为新生代中大多数对象的生命周期都很短,所以发生Minor GC的频率很高,虽然它会触发stop-the-world,但是它的回收速度很快。
  • 对老年代的对象的收集称为major GC。Major GC清理Tenured区,用于回收老年代,出现Major GC通常会出现至少一次Minor GC。
  • 程序中主动调用 System.gc() 强制执行的GC为 Full GC。Full GC是针对整个新生代、老生代、元空间(metaspace,java8以上版本取代perm gen)的全局范围的GC。Full GC不等于Major GC,也不等于Minor GC+Major GC,发生Full GC需要看使用了什么垃圾收集器组合,才能解释是什么样的垃圾回收。

GC 中用于回收的方法称为收集器,由于GC需要消耗一些资源和时间,Java 在对对象的生命周期特征进行分析后,按照新生代、老年代的方式来对对象进行收集,以尽可能的缩短GC对应用造成的暂停。

 

2、垃圾定位

在进行垃圾回收之前,需要首先进行垃圾定位,即判断哪些对象可以进行回收。当对象没有被任何引用指向时就可被垃圾回收。

 

2.1、引用计数法

引用计数法也就是记录当前对象的引用次数,当引用次数为0时则进行回收。给对象添加一个引用计数器,每当有一个地方引用它,计数器值就加一;相反的,当引用失效的时候,计数器值就减一;任何时刻计数器为0的对象就是不可能再被使用的。也就是说,当计时器的数值为0的时候,这个对象就可以被回收了。

引用计数是垃圾收集器中的早期策略,但是引用计数法存在一个巨大的问题,就是循环依赖,例如:

针对上图这种情况,对象ABC之间相互引用,他们的counter永远不可能为0,造成他们永远无法被回收,因此目前主流的 JVM 里都没有选用引用计数算法来管理内存。

示例:

<- 背景 ->
对象objA 和 objB 都有字段 name,两个对象相互进行引用
objA.name = objB;
objB.name = objA;

<- 问题 ->
当这两个对象objA、objB再也没有其他任何引用时,实际上他们应该要被垃圾收集器进行回收才对
但因为他们相互引用,所以导致计数器不为0,这导致引用计数算法无法通知垃圾收集器回收该两个对象

 

标签:收集器,对象,回收,理解,GC,引用,JVM,垃圾
来源: https://www.cnblogs.com/wenxuehai/p/16631896.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有