垃圾查找
1.基于计数器
对象有引用计数,计数为0的,可以被收集
2.基于有向图
从gc root(栈、静态变量、JNI 变量)遍历,能访问的对象,不用被收集,其他的,可以被收集
因为计数器不能解决 互相引用的问题,一般都不使用这种算法
目前商业JVM 都是使用有向图算法 来找垃圾

找到了垃圾,下面开始要回收了

垃圾回收
1.基于复制
把存活对象复制到其他区域,当前区域整体释放
2.基于标记-清除
先标记可回收对象,再释放被回收对象,这种情况下,有内存碎片
3.基于标记-整理
先标记可回收对象,再把不可回收对象 压缩到当前回收域的一端,整体释放当前回收域剩下的区域, 能防止内存碎片

以上这3个算法是基础算法

还有一些具体的加速回收速度,减小停顿时间,增加吞吐量的算法
1.内存分代
不同存活时间的对象,放到不同的分代区域中,新生代/老生代
2.内存分区域
每个代中内存 再分为多个大小相同的区,按区收集垃圾,能减少碎片整理时间
3.执行分阶段
垃圾回收过程分为几个不同的阶段,能减小系统暂停时间
比如先标记垃圾对象,标记完后,发现暂停时间已经比较长了,那就先暂停执行GC,让工作线程先工作,等一段时间后,在执行下一阶段的GC流程

具体垃圾收集器,都是实现了上面某些算法

1.serial gc
串行收集器,单线程执行,追求低停顿时间,用于新生代收集

2.parnew gc
多线程版本的串行收集器,多线程执行,追求低停顿时间,用于新生代收集

3.parallel scavenge gc

并行收集器,多线程执行,追求高吞吐量,用于新生代收集

4.serial old gc
串行老生代收集器,单线程执行,追求低停顿时间,用于老生代收集

5.parallel old gc
并行老生代收集器,多线程执行,追求高吞吐量,用于老生代收集

6.cms gc
并发收集器,多线程执行,追求低停顿时间,用于老生代收集

7.g1 gc
g1收集器,多线程执行,追求低停顿时间,也追求高吞吐量,有点实时、高吞吐量的意思,既用于新生代收集,也用于老生代收集

这个GC 兼顾了停顿时间和吞吐量,是未来GC的方向,目前这个GC稳定性据说还有待验证,如果将来稳定了,大伙都用这个GC就好了

JVM参数和GC收集器的对应关系

UseSerialGC
虚拟机运行在Client 模式下的默认值,打开此开关后,使用Serial + Serial Old 的收集器组合进行内存回收

UseParNewGC
打开此开关后,使用ParNew + Serial Old 的收集器组合进行内存回收

UseConcMarkSweepGC
打开此开关后,使用ParNew + CMS + Serial Old 的收集器组合进行内存回收。
Serial Old 收集器将作为CMS 收集器出现Concurrent Mode Failure失败后的后备收集器使用

UseParallelGC
虚拟机运行在Server 模式下的默认值,打开此开关后,使用ParallelScavenge + Serial Old(PS MarkSweep)的收集器组合进行内存回收

UseParallelOldGC
打开此开关后,使用Parallel Scavenge + Parallel Old 的收集器组合进行内存回收

UseG1GC

打开此开关后,使用G1回收器 回收新生代和老生代内存

注意:指定GC回收器时 一般需要为新生代和老生代分别指定GC回收器,不过有些参数有默认行为,指定了一个参数,就相当于同时指定了 新/老 GC
默认情况下,老生代GC回收器会对pem space(永久代)进行回收,也就是发生full gc(major gc)时,会同时收集老生代和持久代的垃圾对象

GC优化主要针对垃圾回收这些具体算法来进行的

1.不管使用哪种GC,都会导致系统停止响应(stop-the-world),只是时间长短而已,要考虑响应时间和不丢包(UDP)
2.多核CPU尽量使用多线程GC,来减少停顿时间及提高吞吐量
3.吞吐量和停顿时间,一般是个矛盾体,追求吞吐量大,停顿时间就会长;追求停顿时间,吞吐量就小;看应用追求哪个指标,选择相应的算法

内存优化
不仅包括GC优化,也包括内存参数优化
1.内存性能参数优化,包括堆大小等等参数
2.GC优化

JVM优化
1.CPU
2.内存
3.IO

java性能调优
JVM性能分析(找瓶颈\找BUG)
JVM优化
代码优化/bug
操作系统优化
硬件(这个很少涉及)

java gc 总结的更多相关文章

  1. 详解Java GC的工作原理+Minor GC、FullGC

    详解Java GC的工作原理+Minor GC.FullGC 引用地址:http://www.blogjava.net/ldwblog/archive/2013/07/24/401919.html J ...

  2. Java GC回收机制

    优秀Java程序员必须了解的GC工作原理 一个优秀的Java程序员必须了解GC的工作原理.如何优化GC的性能.如何与GC进行有限的交互,因为有一些应用程序对性能要求较高,例如嵌入式系统.实时系统等,只 ...

  3. JAVA GC 简单总结

    GC分代 GC的英文全拼是Garbage Collection,意思是垃圾收集. Java 将堆内存分为三代来管理: - 年轻代 (Young Generation) - 年老代 (Old Gener ...

  4. Java GC收集器配置说明

    根据Java GC收集器具体分类,我们可以看出JVM根据需求不同提供了三种选择:串行收集器.并行收集器.并发收集器. 串行收集器只适用于小数据量的情况,我们主要了解一下并行收集器和并发收集器.默认情况 ...

  5. java gc的工作原理、如何优化GC的性能、如何和GC进行有效的交互

    java gc的工作原理.如何优化GC的性能.如何和GC进行有效的交互 一个优秀的Java 程序员必须了解GC 的工作原理.如何优化GC的性能.如何和GC进行有效的交互,因为有一些应用程序对性能要求较 ...

  6. Java GC系列(4):垃圾回收监视和分析

    本文由 ImportNew - lomoxy 翻译自 javapapers. 目录 垃圾回收介绍 垃圾回收是如何工作的? 垃圾回收的类别 垃圾回收监视和分析 在这个Java GC系列教程中,让我们学习 ...

  7. 应用JConsole学习Java GC

    应用JConsole学习Java GC 关于Java GC的知识,好多地方都讲了很多,今天我用JConsole来学习一下Java GC的原理. GC原理 在我的上一篇中介绍了Java运行时数据区,在了 ...

  8. 成为Java GC专家(3)—如何优化Java垃圾回收机制

    为什么需要优化GC 或者说的更确切一些,对于基于Java的服务,是否有必要优化GC?应该说,对于所有的基于Java的服务,并不总是需要进行GC优化,但前提是所运行的基于Java的系统,包含了如下参数或 ...

  9. Java GC 概念摘要

    很长时间,我想Java的GC做一个小小的总结,他有没有时间.根据最近看了java paper向上java gc文章,我觉得好,读读.顺便说一下,总结下. java paper的GC文章地址,里面有非常 ...

  10. Java GC 专家系列3:GC调优实践

    本篇是”GC专家系列“的第三篇.在第一篇理解Java垃圾回收中我们学习了几种不同的GC算法的处理过程,GC的工作方式,新生代与老年代的区别.所以,你应该已经了解了JDK 7中的5种GC类型,以及每种G ...

随机推荐

  1. Python Learning Day7

    破解极验滑动验证 博客园登录url: https://account.cnblogs.com/signin?returnUrl=https%3A%2F%2Fwww.cnblogs.com%2F 代码逻 ...

  2. 原子类型字段更新器AtomicXxxxFieldUpdater

    本博客系列是学习并发编程过程中的记录总结.由于文章比较多,写的时间也比较散,所以我整理了个目录贴(传送门),方便查阅. 并发编程系列博客传送门 原子类型字段更新器 在java.util.concurr ...

  3. linux服务重启命令

    /etc/init.d/sshd restart/etc/init.d/sshd reload systemctl status sshd.servicesystemctl restart sshd. ...

  4. Windows添加远程访问用户

    Windows远程访问 命令:mstsc ------------------------------------------------------------------------------- ...

  5. SQL笔记整理

  6. APP中H5页面调试神器

    Fiddler Web Debugging Tool for Free by Telerik window 可以 下载,然后我的H5 嵌入到 APP 里面就可以快速捕捉到接口啦.不会因为看不见就得靠“ ...

  7. delphi 文本 记录 流式 读写文件

    unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System ...

  8. RewriteEngine On

    RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond ...

  9. python + selenium +win32gui + winspy 实现图片上传

    过程:模拟点击上传按钮,打开Windows对话框,编辑栏输入文件路径(或网址)点击确定.网上随便找了一个进行测试. 点击后出现Windows上传对话框 用 winspy 来检测窗口的句柄 python ...

  10. JOIN US | 京东云诚聘技术精英

    清新的办公区域感受自然的气息,温馨的团队为你我放飞青春的理想 上有天文下有地理的阅读区域 各类图书提供借阅 绿植环绕生机勃勃的会客区域洋溢青春 [高级Java工程师] 职位描述: 参与云计算相关平台/ ...