热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

关于jvm中gc垃圾回收机制

需要垃圾回收:在程序执行的过程中,会产生一系列的对象(占用内存的代表),这些都会存储在内存中。一部分对象在生命周期结束后,依然会占用一部分内存。这些占用内存却没有再次使用的对象,

需要垃圾回收:
在程序执行的过程中,会产生一系列的对象(占用内存的代表),这些都会存储在内存中。一部分对象在生命周期结束后,依然会占用一部分内存。这些占用内存却没有再次使用的对象,我们称之为“垃圾”,而对“垃圾”占用的内存的回收,就是垃圾回收。

在没有垃圾回收机制的语言里,垃圾回收操作需要程序猿来完成,这常常会导致错误。

内存泄漏:忘记释放一部分内存,导致那一部分内存不可用,并且占用着总的内存空间,如果这种情况一直存在着,那么就可能导致内存空间被占满,系统崩溃。

垂直指针:忘记初始化指向释放了内存的指针(指向曾经存在的对象,但是对象已经不存在了),当再次调用指针的时候,指针指向了空内存,引起bug

释放错误的内存:人为的操作难免会发生错误,如果释放了错误的内存,也会导致程序发生莫名其妙的bug

  1. 垃圾收集器算法:
    (1)标记–清除法(Mark–Sweep): 标记需要回收的对象,标记完成后再统一清除,将其内存空间释放
    缺点:效率问题:清除和标记过程效率都不高;空间问题:会产生大量的不连续碎片内存。
    在这里插入图片描述2. 复制算法(copying):为解决效率问题,先将内存分为两个部分,两部分大小相等。对象分配时,只会在一个区进行分配。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。
    复制算法一般是使用在新生代中,因为新生代中的对象一般都是朝生夕死的,存活对象的数量并不多,这样使用复制算法进行拷贝时效率比较高。
    优点:效率快;不会发生碎片化,移动堆顶指针,按顺序分配内存,实现简单,运行高效。
    缺点:将内存空间缩小为原来一半;持续复制长生存期的对象则导致效率降低。
    在这里插入图片描述新生代的目标就是尽可能快速的手机掉那些生命周期短的对象。老年代的目标是存大对象或声明周期长的对象。

将新生代划分为Eden(伊甸园) 与2块Survivor Space(幸存者区,分别叫From Survivor Space 和 To Survivor Space) 。

然后在Eden –>Survivor Space 以及From Survivor Space 与To Survivor Space 之间实行Copying 算法。 不过jvm在应用复制算法时,并不是把内存按照1:1来划分的,这样太浪费内存空间了。

实际情况是,按照8:1:1来划分,每次GC,把Eden 和某一个 Survivor的存活对象,复制到另一个Survivor,然后把Eden和那个Survivor清空。这样,意味着每次GC后,可以有90%的内存会被利用,只有10%浪费。

如果万一存活对象放不下那个Survivor,会找老年代借一下,称为分配担保。

下图给出内存的具体划分:
在这里插入图片描述

具体工作流程如下:

在GC开始的前,对象只会存在于Eden区和From Survivor区,To Survivor区是空的。

紧接着进行GC,Eden区中所有存活的对象都会被复制到“To”,而在“From”区中,仍存活的对象会根据他们的年龄值来决定去向。年龄达到一定值(年龄阈值,可以通过-XX:MaxTenuringThreshold来设置,默认15)的对象会被移动到年老代中,没有达到阈值的对象会被复制到“To”区域。经过这次GC后,Eden区和From区已经被清空。这个时候,“From”和“To”会交换他们的角色,也就是新的“To”就是上次GC前的“From”,新的“From”就是上次GC前的“To”。不管怎样,都会保证名为To的Survivor区域是空的。Minor GC会一直重复这样的过程,直到“To”区被填满,“To”区被填满之后,会将所有对象移动到年老代中。

对象年龄计算:没经过1次GC,年龄+1。

  1. 标记–整理法(Mark–Compact):
    先标记,再把所有存活的对象向一端移动,然后直接清理端边界意外的内存。
    在这里插入图片描述4. 分代收集:
    在这里插入图片描述JVM内存分配策略:
    (1) 对象优先分配在Eden区,当Eden区空间不足时,JVM会触发一次Minor GC(采用复制算法回收)。
    (2) 大对象直接进入老年代,大对象指需要大量连续内存空间的对象。目的是避免在Eden区和Survivor区之间发生大量的内存拷贝。
    (3)长期存活的对象进入老年代。JVM为每个对象定义了一个年龄计数器,对象经过一次Minor GC会进入Survivor区,之后每经过一次,对象年龄加1,达到阈值对象进入老年区。
    (4)动态判断对象的年龄,如果survivor区相同年龄的所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象直接进入老年代。
    (5)空间分配担保,每次进行Minor GC,JVM会计算Survivor区移至老年区的对象的平均大小,如果这个值大于老年区的剩余值大小,会进行一次Full GC ,如果小于,检查HandlePromotionFailure设置,如果为true 只进行Minor GC,否则进行Full GC。

JVM的平台无关性:javac编译成字节码文件,任何装了JVM的平台都可以直接运行

在这里插入图片描述


推荐阅读
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 本文介绍了作者在开发过程中遇到的问题,即播放框架内容安全策略设置不起作用的错误。作者通过使用编译时依赖注入的方式解决了这个问题,并分享了解决方案。文章详细描述了问题的出现情况、错误输出内容以及解决方案的具体步骤。如果你也遇到了类似的问题,本文可能对你有一定的参考价值。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
author-avatar
前前后后zzyyix
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有