java中的GC(一)

本文介绍了Java中的垃圾回收机制,包括栈帧的工作原理、三种主要的垃圾收集算法(复制、标记-清除、标记-整理)及其优缺点,以及各种垃圾收集器如Serial、ParallelScavenge等的特点。此外,还提及了JVM调优中最大堆和最小堆的设置,以避免内存抖动。

java中的垃圾回收

一、java中的栈帧

由下图可以看出来,每一个方法是一个栈帧,每个栈帧里面存储当前方法里面的变量。栈是先进后出的数据结构,从下面的图中也可以看出来,main方法在栈底,b方法在栈顶。
方法执行完会出栈。

在这里插入图片描述

二、垃圾收集算法

1、复制算法

把内存空间分成两部分,一部分用来存储数据,另一部分空闲。当发生垃圾回收的时候,把存储对象部分的存活的对象复制到另一部分里面,原来存储对象的内存部分清空。

缺点:内存空间浪费

特点:适合存活对象少的场景,新生代对象大多都是朝生夕死的,所以新生代的垃圾收集算法大多使用复制算法
在这里插入图片描述

2、标记-清除算法

第一阶段:对堆空间里面没有任何引用的对象进行标记;第二阶段:清除第一阶段标记的对象

缺点:会产生大量的内存碎片

特点:不会浪费内存空间,适合存活对象多的场景,老年代会使用这个算法
在这里插入图片描述

3、标记-整理算法

第一阶段:标记回收对象;第二阶段:把存活对象整理到一起,并且使用一个指针指向存活对象和空闲空间的分界线

特点:不会有内存碎片,适合老年代
在这里插入图片描述

三、垃圾收集器

1、Serial:单线程,新生代,复制算法
2、Serial Old:单线程,老年代,标记-整理
3、ParNew:多线程,新生代,复制算法
4、Parallel Scavenge:多线程,新生代,复制算法
5、Parallel Old:多线程,老年代,标记-整理
6、CMS(并发标记清除):①初始标记;②并发标记;③重新标记;④并发清除
7、G1:把堆内存分块,每一块可以是新生代也可以是老年代,会有一个表存储每一个region的回收价值,垃圾回收的时候先对回收价值高的region进行回收
在这里插入图片描述

四、JVM调优

最大堆和最小堆是一样的,防止内存抖动。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值