概述
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之堆与栈及垃圾回收所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复