jvm虚拟机之内存模型、垃圾回收

1 篇文章 0 订阅
学习jvm,是学习java的基础,只有吧基础学扎实了以后的路才能走的更远。

jvm内存模型主要分成两大类

  1. 非共享内存:程序计数器,栈,本地方法栈
  2. 共享内存:堆,方法区(元空间)
  • 程序计数器:执行分支,循环,跳转,异常处理等
  • 栈:创建栈帧存储存储局部变量,操作数栈,动态链接,方法出口。存储局部变量八种基本数据
  • 本地方法栈:C库、执行native方法
  • 堆:分为新生代老年代,Eden,s0,s1 默认大小8:1:1 设置-Xmx -Xms
  • 方法区:存储虚拟机已加载的类,常量,静态变量,即时编译器编译后的代码数据。

对象分配内存方式

1、子针碰撞:规整的内存往右移动等量的大小(并发问题需要同步操作)
2、空闲列表:内存不规整,记录每块内存的大小,分配合适大小等内存块(可能会出现内存让费)

判定内存对象那死亡

1、引用计数算法:引用加一,引用失效减一。回收的时候为0(会有循环引用的问题)
2、可达性分析算法: 对象能不能到达root节点。(root节点:虚拟机栈中的引用对象,方法区中的静态属性、常量引用对象,执行中的线程)

gc回收方式

1、标记清除:标记上要回收的对象,在gc的时候清除。两步效率都不高,还会产生大量空间碎片
2、复制算法:把存活的对象复制到另一片内存,全部清除。应大部分对象都是需要回收的,所以8:1:1的内存比例。当复制内存不够的时候有老年代来担保。(新生代)
3、标记整理:把存活对象往一边移动,然后清理掉边界对象。(老年代)

gc收集器

1、serial收集器:单线程、复制算法、新生代。主要Client端使用(简单高效对比其他收集器等单线程)
2、parnew收集器:serial收集器的多线程版本,配合CMS收集器。双核下不一定有serial的效率高(线程切换开销)。
3、Parallel Scavenge收集器:多线程并行、复制算法、新生代。关注吞吐量=运行代码时间/运行代码时间+垃圾收集时间。有两个参数精确控制吞吐量。收集垃圾的停顿时间、吞吐量的大小。还有一个GC自适应调节策略开关。
4、Serial old收集器:单线程、标记整理、老年代。主要Client端使用。service端的话1.5版本前配合Parallel Scavenge收集器、CMS收集器的后备预案。
5、Parallel old收集器:多线程、标记整理、老年代。jdk1.6开始提供,在注重吞吐量及cpu敏感的场合配合Parallel Scavenge收集器
6、CMS收集器:多线程、标记清除、老年代(并发收集、低停顿)。4个步骤,初始标记gc root能关联到的对象、并发标记gc root的追中、重新标记程序继续运作的那部分对象、并发清除。
缺点:

  • cup资源敏感,gc时占用CUP资源导致系统变慢吞吐量下降;
  • 浮动垃圾无法清理,清理阶段产生的垃圾要到下一次gc的时候回收,如果预留内存不够大就会出现失败,触发Serial old收集器来回收;
  • 标记清除导致大对象无法找到合适的空间,提前触发full gc,有参数设置整理碎片,但是时间会增长。

7、G1收集器:并行与并发、标记整理、整个java堆、分代收集、可预测停顿时间(不能超过多少毫秒)。把整个java堆划分成多个大小相等的区域,把每个区域的垃圾价值大小维护成一张表,先回收价值大的区域(回收获得空间大小、和所需的时间的经验值)。
初始标记gc root能关联到的对象,并发标记执行对象可达性分析、最终标记是并发标记时用户线程产生新的变动,记入到remembered set log里面,然后合并到remembered set中。筛选回收排序最高的区域先回收。

堆是我们jvm发生gc时需要重点关注的内存区域,因为这块区域的对象发生OOM时我们程序员需要重点调优的区域。

1、 年轻代 里面主要放新生成对象:

  • 因新生成的对象都是朝生夕死的,90%以上的对象都能被回收掉。所以吧年轻代分为三个区域(Eden,s0,s1 默认大小8:1:1),当Eden区域放满触发一次Minor GC,这个时候把还存活的对象放入s0区域,Eden区域整块回收。当Eden区域再次放满,把Eden、s0区域存活对象放入s1,重复此操作。

2、老年代对象组成:

  • 虚拟机可以设置超过多大的对象直接进老年代;
  • 新生代每次Minor GC时没有被回收的对象年龄会加一,默认超过15次也进入老年代。进入老年代对象年龄也能设置。
  • 动态年判定:GC回收或者相同年龄所有对象大小总和大于Survivor空间的一半,年龄大于等于该对象的就可以直接进入老年代。
  • 空间分配担保:Minor GC前,老年代可分配连续空间是否大于新生代所有对象总空间。如果不大于回去计算历史回收进入老年代的平均空间大小,如果大于冒险回收,空间不够触发FULL GC。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值