JVM垃圾清除算法

这篇具有很好参考价值的文章主要介绍了JVM垃圾清除算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言:大家好,我是小威,24届毕业生,在一家满意的公司实习。本篇将记录几次面试中经常被问到的知识点以及对学习的知识点总结和面试题的复盘。
本篇文章记录的基础知识,适合在学Java的小白,也适合复习中,面试中的大佬🤩🤩。
如果文章有什么需要改进的地方还请大佬不吝赐教👏👏。
小威在此先感谢各位大佬啦~~🤞🤞
jvm清除算法迭代周期,面试,java,学习

🏠个人主页:小威要向诸佬学习呀
🧑个人简介:大家好,我是小威,一个想要与大家共同进步的男人😉😉
目前状况🎉:24届毕业生,在一家满意的公司实习👏👏

🎁如果大佬在准备面试,可以使用我找实习前用的刷题神器哦刷题神器点这里哟
💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,我亲爱的大佬😘

以下正文开始

jvm清除算法迭代周期,面试,java,学习

🎄JVM线程私有和共享的区域

JVM线程私有的区域有:虚拟机栈,本地方法栈,程序计数器

虚拟机栈:主要存储方法,局部变量,运行的数据。
本地方法栈:主要存储本地方法(含有Native关键字的方法)。
程序计数器:存储程序运行位置的字节码行号指示器。

JVM线程共享的区域有:Java堆,元空间

Java堆:存储所有创建的对象,数组等。
元空间:存储虚拟机加载的字节码数据,常量,静态变量,运行时常量池等。

jvm清除算法迭代周期,面试,java,学习

🎇线程上下文切换

线程上下文切换,也就是CPU不再执行当前的线程,而去执行其他的线程。那有哪些原因会导致线程的上下文切换呢?

  1. 线程的时间片用完
  2. 垃圾回收(会暂停当前工作的线程,先进行垃圾回收)
  3. 更高优先级的线程运行
  4. 线程主动调用了某些方法,如sleep,yeild,wait,join,synchronized,lock等

当发生上下文切换时,操作系统会保存当前线程的状态,恢复另一个线程的状态,此时程序计数器会记住下一条jvm指令的执行地址,同时上文记录,程序计数器是线程私有的

jvm清除算法迭代周期,面试,java,学习

🍒如何判断对象是否存活

判断对象是否存活有两种方法:引用计数算法和可达性分析算法

🍸引用计数法

在对象被创建的时候,会在对象头中分配一个空间,即计时器,来保存这个对象被引用的次数。如果这个对象被其他的对象引用,它的引用计数器会+1,如果删除其他对象对这个对象的引用,则它的引用计数会-1,当对象的引用计数为0时,这个对象就会被当成垃圾回收。

优点:
引用计数法实现起来比较简单,判断对象是否存活的效率比较高。
缺点:
无法解决对象之间循环引用的问题,不能检测到环的出现。例如,A和B之间相互引用,此时计数器都会显示为1,此时A和B都无法进行垃圾回收。

jvm清除算法迭代周期,面试,java,学习

🎍可达性分析法

Java虚拟机中的垃圾回收机制都是采用的可达性分析算法来探索存活的对象的。此种方法工作原理是会扫描java堆中的对象,沿着GC Roots对象往下寻找,看看是否能在此引用链中找到该对象,如果找不到的话,证明该对象没用了,表示该对象可以回收。

可达性分析算法最大的优点之一就是解决了对象之间的相互循环依赖的问题,目前和引用计数法比起来没有缺点

🍖JVM中的垃圾回收算法

对于新生代和老年代的对象,在JVM中会采取不同的垃圾回收算法。年轻代的对象一般都是朝生暮死的,创建之后很快就会被回收,而老年代的对象是需要长期存活的,因此用到的算法大不相同。新生代对应的收集方法为“Minor GC”,老年代对应的收集方法称为“Major GC”,而对于整个堆空间和方法区的回收被称为“Full GC”

jvm清除算法迭代周期,面试,java,学习

🧃标记清除算法

标记清除算法为最基础的垃圾收集算法,即为每个对象都分配一个标记为,这个标记位会记录对象的状态。标记着所要回收的对象,在标记完成后,统一回收掉所有被标记的对象,也可以标记存活的对象,清理掉未标记的对象。标记清除算法用于老年代的垃圾回收中

优点: 基于可达性分析算法,实现起来比较简单,后续的算法都是基于这种思想来实现的。
缺点:
影响最大的一点在于,标记清除算法会使内存空间碎片化,即标记并清除垃圾后,会产生很多不连续的内存空间,这将导致较大的对象因为无法找到连续的内存而提前触发一次垃圾回收。

如果大部分对象需要回收,就会进行大量的标记和清除操作,存活对象数量多时效率会降低

jvm清除算法迭代周期,面试,java,学习

🥫复制算法

复制算法被用于新生代的垃圾回收机制中,新生代有三部分,Eden(80%),和两个survivor区(From Survivor 和 To Survivor)。两个Survivor区为容量大小相等的两块内存,每次只使用其中的一块内存,当使用的那块内存用完后,就会将内存中还存活着的对象复制到另一块内存上,然后把使用过的那块内存空间清空。

优点: 实现起来比较简单,效率也比较高,可以保证内存有连续的区域能够解决标记清除算法导致的内存碎片问题。
缺点:
可分配的内存空间缩小了一半儿,代价比较高,内存空间浪费比较多; 存活的对象比较多的时候使用复制算法将会导致效率降低。
进行标记清除算法时,会导致应用程序挂起(停顿),即stop the world(STW)。

扩展:
90%以上的对象都是朝生暮死的,所以在新生代中,每次为对象分配内存时会使用Eden区和其中的一块Survivor区,当发生垃圾回收时,JVM会将Eden和Survivor中存活的对象都复制到另一块Survivor区域内,之后清理掉Eden区和Survivor区域中的空间。综上所述,建立新对象时,新生代可用内存空间为整个儿新生代容量的90%(80%的Eden区和10%的Survivor区),如果发生了极少部分情况,即多于10%的对象存活下来了,没有被垃圾回收器回收掉,此时JVM会触发空间担保机制,即当Survivor空间不足以容纳一次Minor GC后的存活对象时,就需要依赖老年代进行分配担保。

jvm清除算法迭代周期,面试,java,学习

🥓标记整理算法

标记整理法是对标记清除算法的一个改进。第一个阶段和标记清除算法一样,都是将对象标记为存活和死亡状态,然而在第二阶段,标记清除算法只是将被标记的对象进行清除,标记整理算法会将存活的对象进行整理并且放到另一个端,然后再把所有的对象清除掉。
标记整理算法用于老年代的回收机制中

优点: 不会像垃圾清除算法那样产生不连续的内存碎片空间
不会像复制算法那样划分两个区域,提高了空间的利用率
缺点:
效率上肯定更慢一些,因为多了一步整理的操作过程。

🍨如何判断变量是否线程安全

对于成员变量和静态变量

  • 如果它们没有被共享,则它们是线程安全的;
  • 如果它们被共享了,根据它们的状态是否能够改变,又会分两种情况:如果只有读操作,则它们是线程安全的;如果有读写操作,则这段代码是临界区,是需要考虑线程安全的。

对于局部变量是否线程安全

  • 局部变量是线程安全的
  • 但局部变量引用的对象则未必线程安全。如果该对象没有逃离方法的作用访问,它是线程安全的;如果该对象逃离方法的作用范围,则是需要考虑线程安全的。
    jvm清除算法迭代周期,面试,java,学习

🍻最长递增子序列

给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。

子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。

示例 1:

输入:nums = [10,9,2,5,3,7,101,18]
输出:4
解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。

示例 2:

输入:nums = [0,1,0,3,2,3]
输出:4

示例 3:

输入:nums = [7,7,7,7,7,7,7]
输出:1

思路:该题让求出最长的递增子序列,因此至少需要一次遍历,考虑到代码进行到每一步的状态才可以,所以动态规划法解决此题比较容易。

代码+详解:

class Solution {
    public int lengthOfLIS(int[] nums) {
        if(nums.length==0){
            return 0; //长度为0直接返回0
        }
        int [] dp=new int[nums.length];
        dp[0]=1; //初始化数组,也可以调用库函数Arrays.fill(dp,1),但是效率会慢些
        int result=1;//初始化结果
        for(int i=1;i<nums.length;i++){
            dp[i]=1;//初始化数组
            for(int j=0;j<i;j++){
                if(nums[j]<nums[i]){
                dp[i]=Math.max(dp[i],dp[j]+1);//循环更新dp[i]的最大值
                }
            }
            result=Math.max(result,dp[i]);
        }
        return result;
    }
}

jvm清除算法迭代周期,面试,java,学习

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起讨论🍻
希望能和诸佬们一起努力,今后进入到心仪的公司
再次感谢各位小伙伴儿们的支持🤞

jvm清除算法迭代周期,面试,java,学习文章来源地址https://www.toymoban.com/news/detail-809273.html

到了这里,关于JVM垃圾清除算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java虚拟机(JVM):垃圾收集算法

    目录 一、分代收集理论 二、标记-清除算法 三、标记-复制算法  四、标记-整理算法 分代收集理论建立在两个分代假说之上: 1、弱分代假说:绝大多数对象都是朝生夕灭的。 2、强分代假说:熬过越多次垃圾收集过程的对象就越难以消亡。 这两个分代假说共同奠定了多款垃

    2024年02月12日
    浏览(50)
  • 【Java】图解 JVM 垃圾回收(一):GC 判断策略、引用类型、垃圾回收算法

    垃圾 是指运行程序中 没有任何引用指向的对象 ,需要被回收。 内存溢出 :经过垃圾回收之后,内存仍旧无法存储新创建的对象,内存不够溢出。 内存泄漏 :又叫 “ 存储泄漏 ”,对象不会再被程序使用了,但是 GC 又不能回收它们。例如:IO 流不适用了但是没有被 Close、

    2024年02月19日
    浏览(48)
  • JVM学习 GC垃圾回收机制 (堆内存结构、GC分类、四大垃圾回收算法)

    🤖 作者简介: 努力的clz ,一个努力编程的菜鸟 🐣🐤🐥   👀 文章专栏: 《JVM 学习笔记》 ,本专栏会专门记录博主在学习 JVM 中学习的知识点,以及遇到的问题。   🙉 文章详情: 本篇博客是学习 【狂神说Java】JVM快速入门篇 的学习笔记,关于 GC垃圾回收机制 (堆内存结

    2023年04月19日
    浏览(42)
  • 【Java虚拟机】JVM垃圾回收机制和常见回收算法原理

    1.垃圾回收机制 (1)什么是垃圾回收机制(Garbage Collection, 简称GC) 指自动管理动态分配的内存空间的机制,自动回收不再使用的内存,以避免内存泄漏和内存溢出的问题 最早是在1960年代提出的,程序员需要手动管理内存的分配和释放 这往往会导致内存泄漏和内存溢出等问

    2024年02月02日
    浏览(50)
  • 【JVM】JVM 垃圾回收算法

    目前JVM中有三种常见的垃圾回收算法,分别是:标记清除、标记整理和复制,这三种垃圾回收算法各有优缺点,下面逐一介绍。 在读本篇文章中,如果对JVM中哪个是垃圾,哪个不是垃圾,JVM到底是怎么知道的,请先读下面这篇文章 【JVM】JVM 判断对象存活算法(引用计数算法

    2024年02月09日
    浏览(51)
  • JVM基础(5)——JVM垃圾回收算法

    作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO 联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬 学习必须往深处挖,挖的越深,基础越扎实! 阶段1、深入多线程 阶段2、深入多线程设计模式 阶段3、深入juc源码解析

    2024年02月02日
    浏览(46)
  • JVM回收算法(标记-清除算法, 复制算法, 标记-整理算法)

    最基础的算法,分为两个阶段,“标记”和“清除” 原理: - 标记阶段:collector从mutator根对象开始进行遍历,对从mutator根对象可以访问到的对象都打上一个标识,一般是在对象的header中,将其记录为可达对象。 - 清除阶段,collector对堆内存(heap memory)从头到尾进行线性的遍历

    2024年02月16日
    浏览(42)
  • JAVA 学习 面试(三)JVM篇

    JAVA虚拟机(JVM) JDK、JRE、JVM的关系 JDK JRE = Java虚拟机 + Java核心类库 JVM组成结构: (1)类加载器 (2)运行时数据区 (3)执行引擎 (4)本地库接口 类加载器 Java程序运行的时候,编译器将Java文件编译成平台无关的Java字节码文件(.class),接下来对应平台JVM对字节码文件进

    2024年01月22日
    浏览(50)
  • JVM——StringTable面试案例+垃圾回收+性能调优+直接内存

    JVM——引言+JVM内存结构_北岭山脚鼠鼠的博客-CSDN博客 书接上回内存结构——方法区。 这里常量池是运行时常量池。 intern()方法  intern() 方法用于在运行时将字符串添加到内部的字符串池stringtable中,并返回字符串池stringtable中的引用。 返回值 当调用 intern() 方法时,如果字符

    2024年02月12日
    浏览(47)
  • 【JVM】垃圾收集算法

    当前商业虚拟机的垃圾收集器,大多数都遵循了“分代收集”(Generational Collection)[1]的理论进 行设计,分代收集名为理论,实质是一套符合大多数程序运行实际情况的经验法则,它建立在两个分代假说之上: 弱分代假说(Weak Generational Hypothesis):绝大多数对象都是朝生夕

    2024年02月10日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包