性能测试三十五:jvm垃圾回收-GC
垃圾回收-GC
三个问题
哪些内存需要回收?
什么时候回收?
如何回收?
YoungGC和FullGC:
新生代引发的GC叫YoungGC
老年代引发的GC叫FullGC
FullGC会引起整个Jvm的用户线程暂停,待垃圾回收完毕后,才继续运行
引用的定义:
如果reference类型的数据中存储的数值代表的是另外一块内存的起始地址,就称这块内存代表一个引用
对象存活状态:
确定对象“存活”还是“死去”:以下两种算法原理都一样,就是看当前这个对象,是否有引用正在指向它,如果有,就是还有用的,如果没有,就清除
第一种:引用计数算法(已被废弃):
如果当前对象有一个引用正在指向它,则在其对应的计数器上+1,统计完后计数器上为0的就代表没用的对象,进行清除
第二种:根搜索算法(GC Roots):
先找到对象,再根据对象去搜索,看有没有引用正指向它,如果有,就是还有用的,如果没有,就清除
永久代的垃圾回收:
永久代回收“性价比”比较低,因为里面放的都是静态的对象,都是有用的,无法回收,就算触发了一次回收,占用内存还是不会变
主要回收
废弃的常量
无用的类
类的所有实例都已经被回收
加载该类的ClassLoader已经被回收
该类的Class对象没有在任何地方被引用
堆垃圾回收算法:
1、标记-清除算法
以两种状态个所有对象分类,然后清除掉可回收的部分
特点:
分为“标记”和“清除”两个阶段
标记完成后,统一回收
缺点:
效率,标记和清除过程效率都不高
空间,标记清除后会产生大量不连续的内存碎片

2、复制算法
把内存分为ab两块,触发垃圾回收的时候,直接把a里面可用的对象有序的复制到b里面,并清空a(和新生代的原理一样)
特点:
内存分为相等的两块
当一块内存用完,将存活对象复制到另外一块中,原内存一次性清理掉
复制时按照顺序分配内存,无内存碎片问题
新生代使用此算法
缺点:
将内存分为两半,利用率低

3、标记-压缩算法
根据标记清除算法改良而来
特点:
先对存活对象进行标记
让所有存活对象向一边移动
清理掉存活对象边界外的所有内存
注:老年代使用此算法

4、分代收集算法
当代的商业虚拟机都采用“分代收集”
根据对象的存活周期的不同将内存划分成几块,一般Java堆分为新生代和老年代
新生代采用复制算法
老年代采用标记-压缩算法
垃圾收集器
以上的所有算法,都只是理念,而垃圾收集器是内存回收算法的具体实现,没有完美的收集器
Jvm不同的区域可以采用不同的垃圾收集器组合,主要有:
1、Serial收集器(串行)
单线程收集器
用户线程全部停止(Stop the world)
Client模式下,新生代默认收集器
优点:简单、高效

2、ParNew收集器(并行)
并行收集器,Serial收集器的多线程版本
Server模式下Jvm默认的新生代收集器
默认开启的垃圾回收线程与cpu核数一致

3、CMS收集器(并发)
并发收集器(ConcurrentMarkSweep)
采用了标记-清除算法
并发收集、低停顿
缺点:
消耗cpu
会产生内存碎片
浮动垃圾(Concurrent Mode Failure

4、G1收集器
性能测试三十五:jvm垃圾回收-GC的更多相关文章
- JVM垃圾回收——GC
一.JVM内存分配与回收 下图为堆内存结构图(注意:元数据区(MetaData )实际上不属于堆): 1.对象优先在Eden区分配 大多数情况下,对象在新生代中Eden区分配.当Eden区没有足够空间 ...
- JVM垃圾回收(GC)流程
/* 首先介绍一下JVM中堆内存的组成: JVM堆内存主要由三部分组成: (1)新生代: 伊甸园区,存活区,伸缩区 (2)老年代: 老年区,伸缩区 (3)元空间(永久代): 元空间,伸缩区 注意:JD ...
- JVM 垃圾回收GC Roots Tracing
1.跟搜索算法: JVM中对内存进行回收时,需要判断对象是否仍在使用中,可以通过GC Roots Tracing辨别. 定义: 通过一系列名为”GCRoots”的对象作为起始点,从这个节点向下搜索,搜 ...
- Java虚拟机(三):JVM垃圾回收机制
概述 垃圾收集 Garbage Collection 通常被称为“GC”,它诞生于1960年 MIT 的 Lisp 语言,经过半个多世纪,目前已经十分成熟了. jvm 中,程序计数器.虚拟机栈.本地方 ...
- JVM垃圾回收GC
1.堆的分代和区域 (年轻代)Young Generation(eden.s0.s1 space) Minor GC (老年代)Old Generation (Tenured space) ...
- JVM—垃圾回收GC算法
1 GC算法简介 算法 特点 标记-清除 分为"标记"和"清除"两个阶段 复制 可以解决效率问题,将可用的内存按容量划分为大小相等的两块. 标记-整理 先标记. ...
- JVM学习(三)JVM垃圾回收
一.引用的分类 在了解JVM垃圾回收机制之前,了解一下对象的引用类型是非常必要的. 强引用:GC时不会被回收 软引用:描述有用但不是必须的对象,在发生内存溢出异常之前被回收 弱引用:描述有用但不是必须 ...
- JVM学习——垃圾回收GC(学习过程)
JVM学习-垃圾回收(GC) 2020年02月19日06:03:56,开始学习垃圾回收,学习资料来源(张龙老师的JVM课程) JVM内存数据区域知识复习 学习垃圾回收之前,要对JVM内部的内存区域有详 ...
- 修改Tomcat的jvm的垃圾回收GC方式为CMS
修改Tomcat的jvm的垃圾回收GC方式 cp $TOMCAT_HOME/bin/catalina.sh $TOMCAT_HOME/bin/catalina.sh.bak_20170815 vi $ ...
随机推荐
- Python基础【day02】:元组和购物车练习的知识点
一.元组 元组其实跟列表差不多,也是存一组数,只不是它一旦创建,便不能再修改,所以又叫只读列表 用途:一般情况下用于自己写的程序能存下数据,但是又希望这些数据不会被改变,比如:数据库连接信息等 1.元 ...
- springCloud相关推荐
最近看到微服务很火,也是未来的趋势 所以就去学习下,在dubbo和spring cloud之间我选择了从spring cloud,主要有如下几种原因: dubbo主要专注于微服务中的一个环节--服务治 ...
- Executor, ExecutorService 和 Executors 间的不同
java.util.concurrent.Executor, java.util.concurrent.ExecutorService, java.util.concurrent. Executors ...
- HDU - 4333 Revolving Digits(扩展KMP)
http://acm.hdu.edu.cn/showproblem.php?pid=4333 题意 一个数字,依次将第一位放到最后一位,问小于本身的数的个数及等于本身的个数和大于本身的个数,但是要注意 ...
- 在windows中停止mysql提示:'服务正在启动或停止中,请稍候片刻后再试一次'
发现mysql的windows服务异常,准备卸载并重新注册服务,输入: mysqld --remove MySQL 提示: 发现卸载不掉这个服务,于是找到MySQL服务的pid sc queryex ...
- webstorm常用功能FTP,及常用快捷键
常用的FTP功能截图如下: 打开配置窗口 常用配置选项,填好FTP登录信息后点 Test FTP 测试一下,(测试之前,这里选“被动模式”) 默认选哪个FTP上传 注意这里的路径是开发后的上传和访问路 ...
- C#检测鼠标移动消息
当C#窗口上有其它控件时,窗口本身检测不到消息.1.使用WndProc.MouseMove不行,比如 protected override void WndProc(ref Message m) { ...
- 异常处理com.sun.image.codec.jpeg.JPEGImageEncoder
以下方案不一定能解决问题.解决方案:配置JDK的JRE_HOME 环境变量既可. Linux 下配置 : vi /etc/profile 在profile文件下面追加写入下面信息: export J ...
- Hyper-V和其他虚拟机共存 【转】
由于Windows中Hyper-V的实现方式在系统中为独占,所以其不能与其他的虚拟机共存. 下面的方法是在系统中新增一个启动项,在这个启动项中关闭Hyper-V,这样就可以安装并使用其他虚拟机了.需要 ...
- C# this调用构造函数及析构函数
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace trai ...