java gc 总结
垃圾查找
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 总结的更多相关文章
- 详解Java GC的工作原理+Minor GC、FullGC
详解Java GC的工作原理+Minor GC.FullGC 引用地址:http://www.blogjava.net/ldwblog/archive/2013/07/24/401919.html J ...
- Java GC回收机制
优秀Java程序员必须了解的GC工作原理 一个优秀的Java程序员必须了解GC的工作原理.如何优化GC的性能.如何与GC进行有限的交互,因为有一些应用程序对性能要求较高,例如嵌入式系统.实时系统等,只 ...
- JAVA GC 简单总结
GC分代 GC的英文全拼是Garbage Collection,意思是垃圾收集. Java 将堆内存分为三代来管理: - 年轻代 (Young Generation) - 年老代 (Old Gener ...
- Java GC收集器配置说明
根据Java GC收集器具体分类,我们可以看出JVM根据需求不同提供了三种选择:串行收集器.并行收集器.并发收集器. 串行收集器只适用于小数据量的情况,我们主要了解一下并行收集器和并发收集器.默认情况 ...
- java gc的工作原理、如何优化GC的性能、如何和GC进行有效的交互
java gc的工作原理.如何优化GC的性能.如何和GC进行有效的交互 一个优秀的Java 程序员必须了解GC 的工作原理.如何优化GC的性能.如何和GC进行有效的交互,因为有一些应用程序对性能要求较 ...
- Java GC系列(4):垃圾回收监视和分析
本文由 ImportNew - lomoxy 翻译自 javapapers. 目录 垃圾回收介绍 垃圾回收是如何工作的? 垃圾回收的类别 垃圾回收监视和分析 在这个Java GC系列教程中,让我们学习 ...
- 应用JConsole学习Java GC
应用JConsole学习Java GC 关于Java GC的知识,好多地方都讲了很多,今天我用JConsole来学习一下Java GC的原理. GC原理 在我的上一篇中介绍了Java运行时数据区,在了 ...
- 成为Java GC专家(3)—如何优化Java垃圾回收机制
为什么需要优化GC 或者说的更确切一些,对于基于Java的服务,是否有必要优化GC?应该说,对于所有的基于Java的服务,并不总是需要进行GC优化,但前提是所运行的基于Java的系统,包含了如下参数或 ...
- Java GC 概念摘要
很长时间,我想Java的GC做一个小小的总结,他有没有时间.根据最近看了java paper向上java gc文章,我觉得好,读读.顺便说一下,总结下. java paper的GC文章地址,里面有非常 ...
- Java GC 专家系列3:GC调优实践
本篇是”GC专家系列“的第三篇.在第一篇理解Java垃圾回收中我们学习了几种不同的GC算法的处理过程,GC的工作方式,新生代与老年代的区别.所以,你应该已经了解了JDK 7中的5种GC类型,以及每种G ...
随机推荐
- MVC三层架构在各框架中的特征
转一篇写得很棒的文章:https://my.oschina.net/win199176/blog/208171?p=7&temp=1495894148424 1.基于web开发中最原始的jsp ...
- 给指定的div增加滚动条
这次的需求是给一个指定的div(里面有个table表格)增加上下.左右的滚动条 通过查找资料后找到了一个可用的方法,代码如下: <!--div比table大小要小才会显示--> <d ...
- 春节前“摸鱼”指南——SCA命令行工具助你快速构建FaaS服务
春节将至,身在公司的你是不是已经完全丧失了工作的斗志? 但俗话说得好:"只要心中有沙,办公室也能是马尔代夫." 职场人如何才能做到最大效能地带薪"摸鱼",成为了 ...
- spring boot2 运行环境
1.springboot个版本系统需求 spring boot maven jdk 内置tomcat 内置jetty servlet 2.0.x 3.2+ 8或9 8.5(3.1) 9.4(3.1) ...
- psp --2
PSP0 ---2 项目计划日志 姓名:赵腾 日期:9/12/2017 任务 日期 听课 编写程序 阅读课 ...
- MySql 的操作指令(window)
1.登录: mysql -uroot -p 2.查看所有数据库: show databases 3.切换数据库 : use databasename(数据库名称) 4.查看数据库的所有表格 ...
- 深入理解 Java —— GC 机制
1. 基础知识 1.1 什么是垃圾回收? 程序的运行必然需要申请内存资源,无效的对象资源如果不及时处理就会一直占有内存资源,最终将导致内存溢出,所以对内存资源的管理非常重要. 垃圾回收就是对这些无效资 ...
- POJ 3659 再谈树形DP
Cell Phone Network Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5325 Accepted: 188 ...
- retrofit 上传文件 跟参数
@Multipart @POST("postFied") Call<Void> postFied(@PartMap Map<String,String> m ...
- Qt在vs2010下的配置
https://blog.csdn.net/chenbang110/article/details/7607250 首先不要使用中文目录, 1 下载Qt的安装包和VS2010的Qt插件 2. 安装Qt ...