JVM怎样判断是垃圾对象进行垃圾回收

简介: 本文讲解JVM怎样判断是垃圾对象进行垃圾回收。

前言



相信大家都听说过JVM垃圾回收机制,大概就是当我们的内存满了的话就会进行垃圾回收机制,将不再用到的对象清理掉,这样我们的内存就又可以有空间存东西了,那么JVM怎么能够知道哪些对象不再用到了呢?下面我来用一个小故事讲解一下。


小故事



李老板开了一个小超市,但是自己平时特别忙,就雇佣了一个管家来看店,平时管家一个人还可以忙的过来,但是快要过年了,大家都来买年货了,管家一个人忙不过来了,然后李老板就找了两个假期短工,一个是学生小明,一个是小明的老师老王,但是呢这两个都需要管家去面试,李老板因为在外地谈生意就直接打电话让两个假期短工直接去超市找管家面试,这里管家只能要一个人,管家想了想觉得学生又便宜又听话,所以就要了学生。到目前为止理论上老师没有面试上就应该回家了,但是在这里管家没有权利让老师回家,老师就赖在店里不走了,老师也不干活也不领工资就是占个座位睡大觉。这个时候店里越来越忙了,这时李老板从外地回来了而且还带回来一个更便宜的假期工小红,但是超市只能容纳三个人,目前已经满了,分别是管家、学生小明、睡觉的老师老王,这个时候李老板就问管家:“你招收了哪个人做假期工了啊!”。管家指向了学生小明,然后李老板知道睡觉的老师老王没有用了,就把他撵出去了,然后李老板让小红进来工作了。


解析



23.png


通过上面的小故事我们来理解一下上面这个图片,上面的图片中person对应管家、student对应小明、teacher对应老师老王,为什么我们在这里要把student和teacher都new出来呢,因为一开始李老板也不知道要哪个人,所以都让他们去超市里面试去了,所以两个人都得new出来,然后再超市里管家招收了学生,就相当于指向了学生一个引用,然后李老板就把老师撵出来了,在这里管家相当于专有名词来说就是“GCRoot根”,而李老板就相当于JVM中用来执行垃圾收集的方法,所以说JVM判断一个对象是不是垃圾就看它有没有被GCRoot根对象引用。


可达性分析算法



上述例子他有一个专有名词叫做“可达性分析算法”,就是通过GCRoot根出发,看看能不能达到一个对象,如果能达到就不是垃圾对象,如果不能达到就是垃圾对象,我们的一个指向就相当于一个小路,由于李老板在问管家招收了谁的时候,管家指向了学生小明,所以学生小明不是垃圾对象就不会被清理,而管家没有指向老师老王,所以老王就相当于垃圾对象就会被清理掉。


总结



所以在java中一个对象不再被使用的时候是不能被立马清理的,必须等李老板(jvm垃圾清理方法)来清理,那么李老板必须等人满了才会过来清理,不满的话是不会过来清理的,所以jvm垃圾清理执行的前提是内存满了,但是垃圾清理方法是会造成系统短暂停顿的,所以我们在jvm调优的时候就是为了尽量不让jvm执行垃圾清理方法。



相关文章
|
5月前
|
Arthas 存储 算法
深入理解JVM,包含字节码文件,内存结构,垃圾回收,类的声明周期,类加载器
JVM全称是Java Virtual Machine-Java虚拟机JVM作用:本质上是一个运行在计算机上的程序,职责是运行Java字节码文件,编译为机器码交由计算机运行类的生命周期概述:类的生命周期描述了一个类加载,使用,卸载的整个过类的生命周期阶段:类的声明周期主要分为五个阶段:加载->连接->初始化->使用->卸载,其中连接中分为三个小阶段验证->准备->解析类加载器的定义:JVM提供类加载器给Java程序去获取类和接口字节码数据类加载器的作用:类加载器接受字节码文件。
517 55
|
7月前
|
Prometheus 监控 算法
CMS圣经:CMS垃圾回收器的原理、调优,多标+漏标+浮动垃圾 分析与 研究
本文介绍了CMS(Concurrent Mark-Sweep)垃圾回收器的工作原理、优缺点及常见问题,并通过具体案例分析了其优化策略。重点探讨了CMS的各个阶段,包括标记、并发清理和重标记
CMS圣经:CMS垃圾回收器的原理、调优,多标+漏标+浮动垃圾 分析与 研究
|
5月前
|
Arthas 监控 Java
Arthas vmtool(从 jvm 里查询对象,执行 forceGc)
Arthas vmtool(从 jvm 里查询对象,执行 forceGc)
376 16
|
5月前
|
缓存 算法 Java
JVM深入原理(八)(一):垃圾回收
弱引用-作用:JVM中使用WeakReference对象来实现软引用,一般在ThreadLocal中,当进行垃圾回收时,被弱引用对象引用的对象就直接被回收.软引用-作用:JVM中使用SoftReference对象来实现软引用,一般在缓存中使用,当程序内存不足时,被引用的对象就会被回收.强引用-作用:可达性算法描述的根对象引用普通对象的引用,指的就是强引用,只要有这层关系存在,被引用的对象就会不被垃圾回收。引用计数法-缺点:如果两个对象循环引用,而又没有其他的对象来引用它们,这样就造成垃圾堆积。
160 0
|
5月前
|
算法 Java 对象存储
JVM深入原理(八)(二):垃圾回收
Java垃圾回收过程会通过单独的GC线程来完成,但是不管使用哪一种GC算法,都会有部分阶段需要停止所有的用户线程。这个过程被称之为StopTheWorld简称STW,如果STW时间过长则会影响用户的使用。一般来说,堆内存越大,最大STW就越长,想减少最大STW,就会减少吞吐量,不同的GC算法适用于不同的场景。分代回收算法将整个堆中的区域划分为新生代和老年代。--超过新生代大小的大对象会直接晋升到老年代。
114 0
|
7月前
|
缓存 监控 算法
JVM简介—2.垃圾回收器和内存分配策略
本文介绍了Java垃圾回收机制的多个方面,包括垃圾回收概述、对象存活判断、引用类型介绍、垃圾收集算法、垃圾收集器设计、具体垃圾回收器详情、Stop The World现象、内存分配与回收策略、新生代配置演示、内存泄漏和溢出问题以及JDK提供的相关工具。
JVM简介—2.垃圾回收器和内存分配策略
|
8月前
|
存储 算法 Java
JVM: 内存、类与垃圾
分代收集算法将内存分为新生代和老年代,分别使用不同的垃圾回收算法。新生代对象使用复制算法,老年代对象使用标记-清除或标记-整理算法。
108 6
|
10月前
|
算法 网络协议 Java
【JVM】——GC垃圾回收机制(图解通俗易懂)
GC垃圾回收,标识出垃圾(计数机制、可达性分析)内存释放机制(标记清除、复制算法、标记整理、分代回收)
|
10月前
|
缓存 监控 算法
Python内存管理:掌握对象的生命周期与垃圾回收机制####
本文深入探讨了Python中的内存管理机制,特别是对象的生命周期和垃圾回收过程。通过理解引用计数、标记-清除及分代收集等核心概念,帮助开发者优化程序性能,避免内存泄漏。 ####
231 3
|
10月前
|
存储 监控 算法
Java虚拟机(JVM)垃圾回收机制深度解析与优化策略####
本文旨在深入探讨Java虚拟机(JVM)的垃圾回收机制,揭示其工作原理、常见算法及参数调优方法。通过剖析垃圾回收的生命周期、内存区域划分以及GC日志分析,为开发者提供一套实用的JVM垃圾回收优化指南,助力提升Java应用的性能与稳定性。 ####