首页 > 其他分享 >JVM理解2

JVM理解2

时间:2022-08-28 01:22:14浏览次数:54  
标签:收集器 对象 回收 理解 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,垃圾
From: https://www.cnblogs.com/wenxuehai/p/16631896.html

相关文章

  • 理解Spring Security和实现动态授权
    一、SpringSecurity架构SpringSecurity是基于SpringAOP和Servlet过滤器的安全框架,提供全面的安全性解决方案。SpringSecurity核心功能包括用户认证(Authenticati......
  • 彻底理解线程
    1线程的意义操作系统支持多个应用程序同时执行,每个应用至少对应一个进程,彼此之间的操作和数据不受干扰。当一个进程需要磁盘IO的时候,CPU就切换到另外的进程,提高了CPU利用......
  • 底层原理解释
    GILGIL是Python的全局解释器锁,同一进程中假如有多个线程运行,一个线程在运行Python程序的时候会霸占Python解释器(加了一把锁即GIL),使该进程内的其他线程无法运行,等该线程运......
  • MyBatis保姆级理解与使用,动态SQL(核心)
    1. 动态SQL(核心)1.1 简介Mybatis框架的动态SQL技术是一种根据特定条件动态拼装SQL语句的功能,它存在的意义是为了解决拼接SQL语句字符串时的难点问题。比如:我们在多条......
  • wx小程序订阅消息概念和应用场景理解(一次性消息一定要人手动触发)
     订阅消息(一次性订阅)和模板消息的区别 原小程序模板消息接口于2020年1月10日下线  订阅消息的特点1. 开发者订阅一次后,只能为其下发一条消息(没有效量限制,将交由......
  • MySQL十六:36张图理解Buffer Pool
    转载~在应用系统中,我们为加速数据访问,会把高频的数据放在「缓存」(Redis、MongoDB)里,减轻数据库的压力。在操作系统中,为了减少磁盘IO,引入了「缓冲池」(bufferpool)机制......
  • C++基础-理解new和delete
    intmain(intargc,charconst*argv[]){ //C风格 int*p=(int*)malloc(sizeof(int)); if(p==NULL){ return-1; } *p=20;//初始化 free(p); int*q=(......
  • 快速理解 自适应和响应式 区别?
    自适应和响应式区别?1.自适应需要开发多套界面,响应式只需要一套2. 自适应:同一个页面用不同的设备去访问的时候,页面布局基本上是一致的,就是尺寸略有不同  响应式:同一......
  • 深入理解JUC:第四章:CountDownLatch倒计时器
    理论:CountDownLatch是一个非常实用的多线程控制工具类。常用的就下面几个方法:CountDownLatch(intcount)//实例化一个倒计数器,count指定计数个数countDown()//计数......
  • 问题记录_IDEA启动报错:Failed to create JVM. JVM Path
    问题记录_IDEA启动报错:FailedtocreateJVM.JVMPath  起因下午写代码的时候感觉IDEA有点卡,不应该啊,我16G咋回卡呢,分配的内存也不小,于是又去加大内存分配,结果IDE......