jvm内存分代模型
2021-07-02 21:15:15 0 举报
jvm
作者其他创作
大纲/内容
对象被局部变量、静态变量引用,则不会被垃圾回收
强引用(不会被垃圾回收)public User user = new User();
Eden800M
类
老年代长期需要持有使用的对象新生代中的对象被回收超过15次还是存在的,则进入老年代
否
动态年龄判断对象年龄1+对象年龄2+对象年龄N>=总对象平均年龄的50%,则此时会把超过年龄N的对象直接转移到老年代
大部分对象创建后都是直接进入到年轻代,当年轻代空间不能再次分配对象时,则进行一次gc
软引用(当内存空间不足进行GC时回收)public SoftRefrence<User> user = new SoftRefrence<>(new User());
Minor GC
系统内存
Full GC回收老年代、年轻代内存
虚引用(不常用)
是
S2
引发
老年代剩余内存大小 >= 之前每一次Minor GC之后进入老年代的对象平均大小
剩余存活对象大小 > 老年代剩余空间大小
大对象直接进入老年代-XX:PretenureSizeThreshold 配置对象的阈值
可达性分析法GC Roots(GC Root Set)以GC Roots为起点,逐级向下进行搜索;如果一个对象到GC Roots时都没有被引用,则此对象表明不可用,可以被垃圾回收;软引用、弱饮用还是会被回收
GC后
类回收
jvm进程内存
新对象
2块内存区域,减少了内存碎片,降低了内存浪费;复制到心的内存空间时,地址都是连续的;新的对象继续在剩余空间中存放,而另一块内存区域则被清空
Survivor1100MB空闲
metaspace方法区1.8以前叫永久代
-Xms:堆内存大小-Xmx:最大堆内存-Xmn:新生代内存大小-XX:MetaSpaceSize:元空间大小-XX:MaxMetaSpaceSize:元空间最大空间-Xss:每个线程的栈内存大小
GC之前判断,老年代剩余内存空间 >= 年轻代所有对象的大小;年轻代GC之后可能所有的对象都会存活下来
年轻代内存空间
老年代剩余存活对象
垃圾回收线程
-XX:HandlePromitionFailure是否设置JDK1.6之后废除
Monitor GCYoung GC
JDK1.6+
对象引用
年轻代短暂创建并且使用完毕
系统运行使用内存
每次新对象创建先储存到Eden区,等Eden区内存满了的时候,触发Yong GC,把能存活下来的对象复制到S1或者S2;Eden区数据被清空,继续接受新的对象创建;当Eden区内存空间再次满了的时候,触发Yong GC,将存活的对象以及S区有数据的对象一起复制到另一块空闲的S区里,同时清空S区旧的空间以及Eden区;此时年轻代内存则是90%的空间都是在使用中,而10%的空间是空闲,大大提高了内存使用效率
1.所有类的实例已经被回收2.加载这个类的classloader已经被回收3.这个类的所有引用被释放
从始至终,年轻代只有一半的空间在使用,一半的空间在空闲;对内存的使用效率太低
GC之后空间还是不足,则引发OOM
判断不满足
Survivor2100MB
S1
存活对象
空闲S区大小< 剩余存活对象的大小<= 老年代剩余空间大小
长期存活的对象,老年代才是归属
年轻代复制算法优化S1:S2:Eden 1:1:8
S区剩余存活对象
复制算法S1、S2互相复制,清空
存活对象每经过一次GC而存活下来,年龄+1当对象年龄到达15后,则会进入到老年代-XX:MaxTenuringThreshold 设置阈值,默认15-XX:InitialTenuringThreshol 最小值
经过Young GC之后,S区存不下Eden剩下的存活对象,则这些对象直接进入老年代
静态变量
老年代存活对象
剩余存活对象的大小 <= 空闲S区的大小
弱引用(发生GC时就被回收)public WeakRefrence<User> user = new WeakRefrence<>(new User());
0 条评论
回复 删除
下一页