我是靠谱客的博主 结实香氛,最近开发中收集的这篇文章主要介绍JVM之堆与栈及垃圾回收,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

JVM规范与实现

  • 在JVM规范中方法区属于堆;而常量池属于方法区==》常量池属于堆
  • 在JVM实现中没有去遵守这个规则;方法区(no-heap)不属于堆
  • 在JVM规范中Eden区和幸存者区(s0,s1)的比例为1:1
  • 在JVM实现中Eden:s0:s1 = 8:1:1

  • 示意图
  • 在这里插入图片描述
  • 堆的空间比例:
    • 年轻代:年老代=1:2
    • 年轻代中:Eden:to survior(s0):from survior(s1) = 8:1:1

JVM垃圾回收流程

  • 复制清除算法Minor GC FullGC 池对象
  • 堆内存的实际划分图
    在这里插入图片描述

年轻区

  • 年轻代的垃圾清除算法:Minor GC**(复制清除算法)**
    • 新对象全部都存在于Eden区中,当Eden区中的对象累积越来越多;执行垃圾回收(Minor GC):回收垃圾对象并将Eden中的非垃圾对象(JVM垃圾回收机制:可达性算法)转移到to survior(s0)区中;当s0中对象也越来越多:回收垃圾对象并将s0中的非垃圾对象转移到s1(from survior)区中;当S1区中对象过多时:回收垃圾对象并将非垃圾对象转移到s0区中。一个对象从s0到s1再从s1到s0为一次循环。当循环达到默认值15次将此对象转入年老区。
    • 复制清除算法中的分配担保原则:当清除垃圾的速度跟不上生产垃圾的速度时;直接将对象放到年老区中
  • 优缺点
    • 速度快(对象自身特点)
    • 没有内存碎片

年老区

  • 池对象(线程池、连接池。。)一般活跃在此区域
  • 年老区的垃圾回收算法:FullGC
  • 标记清除算法(最基础的算法):将垃圾对象逐一标记,然后再逐一清理
    • 优缺点
      • 内存不连续(有内存碎片)
      • 效率低
  • 标记整理/压缩算法:找一块儿内存将内存中的非垃圾对象全部整理排列在里边,然后将垃圾对象全部回收
    • 优缺点
      • 优:没用内存碎片
      • 缺:速度慢(对象自身特点决定)
    • 当年老区满了之后(或者年轻代需要存放对象进来而内存不足)的情况下触发FullGC进行垃圾回收;当执行完FullGC后仍然无法存放对象,则发生堆内存溢出(OutOfMemoryError
      演示:
      在这里插入图片描述
      顺带一提:JVM的大小是一个区间有初始大小(物理内存的1/64)和最大使用大小(物理内存的1/4);但在实际开发中为了不必要的资源浪费调为一样;通常为计算机物理内存的3/4(根据公司实际情况而定)

永久区(JDK1.8之后已经没有了)

  • 永久区是一个常驻内存区域,用于存储JDK自身携带的Class,Interface的元数据,也就是说它储存的是运行环境所必需的类信息,被装载进该区域的数据几乎是不可能被垃圾回收器所回收的;
    • 回收条件:
      • 该类所有对象都已经被回收
      • 加载该类的类加载器已经被回收
      • 该类的java.lang.Class对象没有被任何地方引用

四种引用

  • 强引用:不会被自动断开引用如:平时我们常用的new
  • 软引用:当内存不足发生gc后,就会自动回收,当内存足够时,当成普通引用;
  • 弱引用:一旦发生GC就会被回收无论是否内存不足
  • 虚引用:设置虚引用后在对象被回收时会收到一个系统通知

最后

以上就是结实香氛为你收集整理的JVM之堆与栈及垃圾回收的全部内容,希望文章能够帮你解决JVM之堆与栈及垃圾回收所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部