垃圾查找
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. javascript 连续赋值(连等运算)问题研究

    前几天看到一个javascript 连续赋值的问题,运行了一下,结果出乎意料,发现这里的水真的有点深啊,连续赋值的底层机制,没有一本前端书籍有详细介绍的,自己做实验研究了一下,先来看结果: var a ...

  2. 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:Spring JDK动态代理

    JDK 动态代理是通过 JDK 中的 java.lang.reflect.Proxy 类实现的.下面通过具体的案例演示 JDK 动态代理的使用. 1. 创建项目 在 MyEclipse 中创建一个名称 ...

  3. cf1200 D White Lines(二维差分)

    题目大意 有一个大小为n的矩阵,每个1*1的单位为黑或白,我们可以用一个(只有一个)大小为k*k的白色矩阵覆盖,问:最多的时候有几条白线(横的全为白 或竖的全为白 即为白线). 思路 要想把一条线(以 ...

  4. 浅谈无参数RCE

    0x00 前言 这几天做了几道无参数RCE的题目,这里来总结一下,以后忘了也方便再捡起来. 首先先来解释一下什么是无参数RCE: 形式: if(';' === preg_replace('/[^\W] ...

  5. OpenStack(四)——使用Kolla部署OpenStack多节点云

    (1).实验环境 主机名 IP地址 角色 内存 网卡 CPU 磁盘 OpenStack-con 192.168.128.110 controller(控制) 8G 桥接网卡ens32和ens33 4核 ...

  6. Windbg 实践之结合条件断点

    Case 1 1.bu USER32!PostMessageW "r $t0=@$t0+1;.printf\"PostMessageW Call Count:%d\",@ ...

  7. .NET技术-4.0. NETCORE跨域

    .NET技术-4.0. NETCORE跨域 1.安装程序CORS程序包,一般默认都带了此程序包的 Install-Package Microsoft.AspNetCore.Mvc.Cors 2.配置C ...

  8. 京东云携手Mellanox,设计最先进SDN硬件加速功能并开源

    京东云携手Mellanox,设计最先进SDN硬件加速功能并开源 最新技术播报 京东云开发者社区  导语新一代 SDN.NFV 和云原生计算技术正在推动应用实例的极限,这些实例可以在虚拟化和容器化的服务 ...

  9. sqlmap简单流程使用

    -u “(url)” 1.判断可注入的参数 2.判断可以用那种SQL注入技术来注入 3.识别出哪种数据库 4.根据用户选择,读取哪些数据 sqlmap支持五种不同的注入模式: 1.基于布尔的盲注,即可 ...

  10. VCPU的解释

    vCPU,顾名思义,是虚拟CPU. 创建虚拟机时,需要配置vCPU资源. 因此vCPU是虚拟机的部件. 因此脱离VM,谈论vCPU是没有意义的. 虚拟化管理系统如何调度vCPU,取决于系统内的虚拟机数 ...