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调优
最大堆和最小堆是一样的,防止内存抖动。

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

被折叠的 条评论
为什么被折叠?



