老年代 2/3
堆 new 新对象
新年代 1/3 eden 8/10 survior s0 1/10 s1 1/10
栈 先进后出 线程运行 就会分配一个栈帧内存空间 放该方法中得局部变量
栈帧 局部变量表 操作数栈 动态连接 方法出口
程序计数器 : 存的是马上执行的那行代码的内存地址 由来:当多线程时 其他线程cpu时间片大于该线程 为了记录该线程执行的位置 下次直接执行
: 如何动态修改程序计数器
方法区 存常量 静态变量 类信息
本地方法栈
gc垃圾回收机制
可达性分析算法
1.先找gc roots根节点 比如静态变量 局部变量
2.在从堆中找到该节点,在找所有引用到该节点的对象 标记为非垃圾数据,其他标记为垃圾对象
3.将非垃圾数据由eden区复制到serve s0中 ,其他垃圾数据直接删除 分代年龄+1
4.当eden中内存又满了 再次执行minor gc (minor gc算法是回收整个年轻代 只要有对象就会回收)
5.如果survior中的还存活 放入s1中 将eden 存活的也放在s1中 分代年龄+1 其他区中垃圾全部回收
6.当年龄达到15时 放到老年代中
7.老年代满了之后 触发full gc (回收整个老年代和年轻代)
进入老年代的方法
1.通过15次的minor gc回收机制未被回收
2.当survior区放不下直接放入老年代
oom 内存泄露
当老年代的数据存满且都为非垃圾数据 并且还一直复制新数据进入老年代
stw
stop the word
当触发 gc 时会触发 stw 机制 :会使用户暂时暂停业务 jvm 调忧就是减少 full gc 从而使用户的体验更好 不在卡顿
标签:eden,模型,回收,gc,内存,jvm,线程,年代,垃圾 From: https://www.cnblogs.com/tommiao/p/17030585.html