JVM的运行时内存也叫做JVM堆,从GC的角度可以将JVM分为新生代、老年代和永久代。

其中新生代默认占1/3堆内存空间,老年代默认占2/3堆内存空间,永久代占非常少的对内存空间。

新生代又分为Eden区、SurvivorFrom区和SurvivorTo区, Eden区默认占8/10新生代空间,SurvivorFrom区和SurvivorTo区默认分别占1/10新生代空间;Eden区最小占3/5新生代空间,SurvivorFrom区和SurvivorTo区分别占1/5新生代空间,如下图所示:

永久代

永久代指内存的永久保存区域,主要存放Class和Meta(元数据)的信息。Class在类加载时被放入永久。永久代和老年代、新生代不同,GC不会在程序运行期间对永久代的内存进行清理,这也导致了永久代的内存会随着加载的Class文件的增加而增加,在加载Class文件过多时会抛出Out Of Memory异常,比如Tomcat引用Jar文件过多会导致JVM内存不足而无法启动。

需要注意的是,在Java 8 中永久代已经被元数据区(也叫做元空间)取代。元数据区的作用和永久代类似,二者最大的区别在于:元数据区并没有使用虚拟机内存,而是直接使用操作系统的本地内存。因此,元空间的大小不受JVM内存的限制,之和操作系统的内存有关。

在Java 8 中,JVM将类的元数据放入本地内存(Native Memory)中,将常量池和类的静态变量放入Java堆中,这样JVM能够加载多少元数据信息就不再由JVM的最大可用内存(MaxPermSize)空间决定,而由操作系统的实际可用的内存空间决定。

原文链接:https://blog.csdn.net/qq_45886144/article/details/124083079

一、四大垃圾回收算法

1、引用计数器算法

原理其实很简单,给运行的对象添加一个引用计数器,每当有一个地方引用它时,计数器+1;当引用失效时,计数器就-1,任何时刻计数器为0的对象,就视作不可能再被使用。这一种方式,实现简单,逻辑也清晰,大部分的情况下,它都可以达到很好的效果,尽管这样,计数器算法还是存在但是的,但是它无法解决循环引用的场景,这也是主流Java虚拟机没有选用这一算法的原因。

2、复制算法(Copying)

为了解决标记清除算法的效率问题,有人提出了复制算法。它将可用内存一分为二,每次只用一块,当这一块内存不够用时,便触发 GC,将当前存活对象复制(Copy)到另一块上,以此往复。这种算法高效的原因在于分配内存时只需要将指针后移,不需要维护链表等。但它最大的问题是对内存的浪费,使用率只有 50%。

但这种算法在一种情况下会很高效:Java 对象的存活时间极短。据 IBM 研究,Java 对象高达 98% 是朝生夕死的,这也意味着每次 GC 可以回收大部分的内存,需要复制的数据量也很小,这样它的执行效率就会很高。

优点:没有标记和清除的过程,效率高;没有内存碎片,可以利用bump-the-pointer实现快速内存分配。

缺点:需要双倍空间。

3、标记清除算法(Mark Sweep)

该算法很简单,使用通过可达性分析方法标记出垃圾,然后直接回收掉垃圾区域。简单粗暴,即标记删除的对象,对其进行内存回收;它的一个显著问题是一段时间后,内存会出现大量碎片,导致虽然碎片总和很大,但无法满足一个大对象的内存申请,从而导致 OOM,而过多的内存碎片(需要类似链表的数据结构维护),也会导致标记和清除的操作成本高,效率低下。

缺点:两次扫描,耗时严重;会产生内存碎片。

可达性算法

此算法的核心思想:通过一系列称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索走过的路径称为“引用链”,当一个对象到 GC Roots 没有任何的引用链相连时(从 GC Roots 到这个对象不可达)时,证明此对象不可用。

4、标记压缩算法(Mark Sweep)

只是在标记清除的基础上,追加了碎片的散落问题,在清除之后进行了碎片的整理,但副作用是增了了GC的时间。

二、七大垃圾回收器

http://www.manongjc.com/detail/62-sjaactrbfltsjah.html

四大垃圾回收算法七大垃圾回收器相关推荐

  1. 垃圾回收算法以及垃圾回收器_什么是垃圾回收?

    垃圾回收算法以及垃圾回收器 以下是我们的垃圾收集手册中的一个示例,该手册将在接下来的几周内发布. 同时,花点时间熟悉垃圾收集的基础知识-这将是本书的第一章. 乍一看,垃圾收集应该处理顾名思义的问题–查 ...

  2. 2 自动内存管理机制(一)运行时数据区域、垃圾回收算法和垃圾回收器

    文章目录 自动内存管理机制(一)运行时数据区域.垃圾回收算法和垃圾回收器 运行时数据区域 垃圾收集算法(方法论) 垃圾收集器(具体实现) 附录 响应时间和吞吐量 参考 自动内存管理机制(一)运行时数据 ...

  3. 【11-JVM面试专题-说说你知道的垃圾回收算法?垃圾回收器你知道吗?CMS、G1和ZGC垃圾回收器你有过了解吗?】

    JVM面试专题-说说你知道的垃圾回收算法?垃圾回收器你知道吗?CMS.G1和ZGC垃圾回收器你有过了解吗? JVM面试专题-说说你知道的垃圾回收算法?垃圾回收器你知道吗?CMS.G1和ZGC垃圾回收器 ...

  4. jvm垃圾回收算法和垃圾回收器

    垃圾回收算法 jvm垃圾回收算法包括复制算法.标记清楚算法和标记整理算法,它们都基于分代收集理论.所谓分代收集理论,可以理解为jvm根据对象的生命年龄将他们分在不同的内存模块,也就是熟知的新生代和老年 ...

  5. 垃圾回收算法与垃圾回收器

    Java与C++等语言最大的技术区别:自动化的垃圾回收机制(GC) 为什么要了解GC和内存分配策略 1.面试需要 2.GC对应用的性能是有影响的: 3.写代码有好处 栈:栈中的生命周期是跟随线程,所以 ...

  6. 垃圾回收算法_Java 垃圾回收算法与几种垃圾回收器

    一.如何确定某个对象是"垃圾"? 目前主流垃圾回收器都采用的是可达性分析算法来判断对象是否已经存活,不使用引用计数算法判断对象时候存活的原因在于该算法很难解决相互引用的问题.如何确 ...

  7. JVM架构、JVM垃圾回收机制、垃圾回收算法、垃圾回收器、JMM(内存模型)

    0 JVM和Java的关系 JDK = JRE + Java开发工具(java,javac,javadoc,javap-) JRE = JVM + Java核心类库 即: JDK = JVM + Ja ...

  8. 胡说八道JVM—垃圾回收算法和垃圾回收器

    垃圾回收算法 引用计数器法(Reference Counting) 可达性分析 标记清除算法(Mark-Sweep) 这个算法的原理很简单,但是它却是其他算法的基础,后续的其他算法否是在这个算法的基础 ...

  9. JVM学习笔记(二):垃圾回收、垃圾回收算法、垃圾回收器(Serial、Parallel、CMC、G1)、内存分配原则实战

    垃圾回收 一.判断对象是否可以被回收 1.引用计数计数法 内容:在对象中添加一个引用计数器,每当有一个地方引用它,计数器就加一:当引用失效时,计数器就减一:任何时刻计数器为零的对象都是不可能在被使用的 ...

最新文章

  1. PAT(甲级)2019年春季考试 7-4 Structure of a Binary Tree
  2. Typescript 其实就想排个序和枚举取数
  3. SpringMvc 3.x跨域+ajax请求
  4. 在Linux上如何打开或运行AppImage软件
  5. 《汇编语言》实验五课程
  6. 【网络安全】一次授权的渗透测试
  7. 江苏卫视舞蹈演员机器人_虽然跨年湖南卫视收视第一,但要说专业,还属江苏卫视...
  8. rest服务器性能,使用多线程提高REST服务性能
  9. 推荐一个女画家的系列画:《公主的妄想症》之《喜欢就是要全部》
  10. 从客户端登陆服务器的配置文件,BLE模式和配置文件
  11. 爆款入门 | 第 14 期微生物组-扩增子16S分析和可视化(线上/线下同时开课,2022.4)...
  12. Spring Boot 使用模板引擎
  13. 7个使用JavaScript构建数据可视化的实用工具库,希望你能喜欢
  14. 23-Python-RabbitMQ
  15. Unity中实现表格功能
  16. csdn网友提出关于expdp exclude及impdp问题解答
  17. 使用 Let's Encrypt 为 Zimbra-8.8.15 安装可信任的SSL证书
  18. caffe 人脸识别
  19. One PUNCH Man——特征选择
  20. php word的使用

热门文章

  1. 嵌入式设备交叉编译perf性能分析工具
  2. 飞书开放平台-全新消息卡片搭建工具
  3. 怎么用显卡计算_会议租车价格多少钱,上海会议租车费用怎么计算?
  4. Android专利战对大陆手机产业的影响
  5. 工厂如何选择一款合适的工业平板电脑?
  6. 手机如何取消安全模式
  7. 关于saas模式开发
  8. ff15测试软件翻译,最终幻想15数据详细分析 FF15详细的数值参数测试
  9. ES7 IK中文分词器
  10. 交乘项专题:主效应项可以忽略吗?