JVM系列【6】GC与调优1
JVM系列笔记目录
- 虚拟机的基础概念
- class文件结构
- class文件加载过程
- jvm内存模型
- JVM常用指令
- GC与调优
GC基础知识
什么是垃圾
没有任何引用指向的一个对象或多个对象(循环引用)

如何找到垃圾
- 引用计数(ReferenceCount),缺点:无法解决循环引用
- 根可达算法(RootSearching),从根开始查找,找到对象是有用的,找不到的对象为垃圾。

什么是根? 注意结合上一篇博客 JVM系列【5】JVM常用指令-运行时数据区进行理解。
- 线程栈变量 JVM Stack、native method stack
- 静态变量 static refercences in method area、Clazz
- 常量池 runtime cosntant pool
- JNI指针 c/c++ 指针
常见的垃圾回收算法
- 标记清除(mark sweep)
缺点:位置不连续,产生碎片,效率偏低(需要进行两遍扫描)
适用情况:算法相对简单,适用于存活对象比较多的情况

拷贝算法 (copying)
说明:没有碎片,浪费空间,复制移动对象,需要调整对象引用
适用情况:适用于存活对象较少的情况 只扫描一次

标记压缩(mark compact)
说明:没有碎片,效率偏低(两遍扫描,指针需要调整)

JVM堆内存分代模型(用于分代垃圾回收算法)
堆内存分代模型是部分垃圾回收器使用的模型,除Epsilon ZGC Shenandoah 之外的GC都使用逻辑分代模型,但是G1 是逻辑分代 物理不分代,除此之外都是逻辑分代 而且物理分代。

分代模型中,分新生代和老年代,比例是1:2
新生代 = Eden区+ 2个survivor区
YGC回收后,大多数的对象会被回收,活着的进入s0;
再次YGC,活着的对象eden+s0 进入s1;
再次YGC,活着的对象eden+s1 进入s0;
年龄足够进入老年代,一般垃圾回收器是15,CMS是6;为什么一般垃圾回收器分代年龄是15?参考下 JVM系列【4】内存模型-对象头的内容有哪些,对象头中4位标识GC年龄,所以最大的年龄是
2^4 -1 = 15;s 区装不下,直接进入老年代。
老年代: 存放一些"顽固对象",老年代满了或是分配不下了会触发FCG。
永久代(Permanent Generation,JDK1.7以前)/元数据区(MetaSpace,JDK1.8以后):存放的是Class文件结构,永久代必须指定大小限制 ,元数据可以设置也可以不设置,无上限(受限于物理内存),字符串常量在1.7以前存放在永久代,1.8以后存放在堆中。
垃圾回收类型和对象分配过程
垃圾回收类型
上一个点解释了堆内存分代模型,这里统一下概念:MinorGC=YGC指的是新生代即Y区的垃圾回收,MajorGC=FGC指的是老年代分配不下或是满了发生的GC,包括新生代和老年代。
对象如何分配
在之前的博客中 JVM系列【4】内存模型-new Object()面试6连问-对象如何分配,简单提过这一点。

对照流程图,分配过程:
> 1. new对象后优先在栈上分配,栈上分配的对象`pop`后就消失;
> 2. 是否是大对象(Y区分配不下的对象)?是就分配到O区,O区发生FGC后回收
> 3. 不是大对象,优先分配TLAB(Thread Local Allocation Buffer线程本地分配缓存)上,分配不下就分配到Eden区 。
了解栈上分配、TLAB、分配担保机制和升代
哪些对象栈上分配?
线程私有对象 、无逃逸对象即离开代码块就没有引用的对象、支持标量替换的对象,如类中变量可以用基本变量替换。
线程本地分配Thread Local Allocation Buffer
独占eden空间,默认1%;多线程时候不用竞争eden就可以申请空间,提高效率;可分配小对象分配担保机制
在新生代无法分配内存的时候,把新生代的对象转移到老生代,然后把新对象放入腾空的新生代。参考
对象何时进入老年代?
超过MaxTenuringThreshold指定的次数;
根据动态年龄计算进入老年代,Survivor空间中年龄从小到大的对象进行累加,当加入某个年龄段后,累加和超过survivor区域*TargetSurvivorRatio(默认50%)的时候,就从这个年龄段往上的年龄的对象进行晋升到老年代。参考
常见的垃圾回收器
常见的垃圾回收器有Serial/SerialOld、ParallelScavenge/ParallelOld、ParNew/CMS、G1、ZGC、Shenandoah、Epsilon。Serial/SerialOld、ParallelScavenge/ParallelOld、ParNew/CMS是分代的垃圾回收器,G1是逻辑上分代物理上不分代,ZGC和Shenandoah是不分代,Epsilon是JDK调试用的垃圾回收器。
历史:JDK诞生,Serial追随,为了提供效率诞生PS,为配合CMS,诞生PN,CMS是1.4后期引入的,CMS是里程碑式的GC,但是CMS毛病比较多,因此目前没有任何一个JDK版本默认CMS。

Serial
年轻代 串行回收

SerialOld
老年代 串行回收

PS(ParallelScavenge)
年轻代 并行回收

PO(ParallelOld)
老年代 并行回收

PN(ParNew)
年轻代 增强版PS配合CMS的并行回收。PN 和 PS区别?PN 响应时间优先;PS吞吐量优先
CMS(ConcurrentMarkSweep)
老年代并发的,垃圾回收和应用程序同时运行,降低STW的时间(200ms);
CMS问题比较多,所以现在没有一个版本默认是CMS,只能手工指定;
CMS既然是MarkSweep,就一定会有碎片化的问题,碎片到达一定程度,CMS的老年代分配对象分配不下的时候,使用SerialOld 进行老年代回收,STW无法忍受;
- 如何解决碎片化:设定
-XX:+UseCMSCompactAtFullCollection默认开启;设定-XX:CMSFullGCsBeforeCompaction,默认为0 指经过多少次FGC才进行压缩。 - 浮动垃圾问题解决?降低触发CMS的阈值,保持老年代有足够的空间;参数
-XX:CMSInitiatingOccupancyFraction指定使用CMS时老年代使用了指定阈值的内存后触发FGC,建议68-92%
使用的算法:三色标记+Increamental Update
- 如何解决碎片化:设定
G1
STW可以达到10ms
算法:三色标记+SATB
ZGC
STW号称可以达到1ms
算法:颜色指针ColoredPointers + LoadBarrier
Shenandaoh
算法:ColoredPointers + WriteBarrier
垃圾回收器和内存大小的关系
Serial 几十兆
PS 上百兆-几个G
CMS 20G左右
G1 上百G
ZGC 4T-16T(JDK13可以支持)
知识分享,转载请注明出处。学无先后,达者为先!
JVM系列【6】GC与调优1的更多相关文章
- jvm系列(五):tomcat性能调优和性能监控(visualvm)
tomcat服务器优化 1.JDK内存优化 根据服务器物理内容情况配置相关参数优化tomcat性能.当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出,并且导致应用服务崩溃.因此一般建议堆的最 ...
- JVM系列【6】GC与调优2.md
JVM系列笔记目录 虚拟机的基础概念 class文件结构 class文件加载过程 jvm内存模型 JVM常用指令 GC与调优 了解HotSpot常用命令行参数 JVM的命令行参数参考: https:/ ...
- JVM系列【6】GC与调优5-日志分析
JVM系列笔记目录 虚拟机的基础概念 class文件结构 class文件加载过程 jvm内存模型 JVM常用指令 GC与调优 主要内容 分析PS.CMS.G1的回收日志,目标使大概能读懂GC日志. 测 ...
- jvm系列(六):Java服务GC参数调优案例
本文介绍了一次生产环境的JVM GC相关参数的调优过程,通过参数的调整避免了GC卡顿对JAVA服务成功率的影响. 这段时间在整理jvm系列的文章,无意中发现本文,作者思路清晰通过步步分析最终解决问题. ...
- jvm系列:Java GC 分析
Java GC就是JVM记录仪,书画了JVM各个分区的表演. 什么是 Java GC Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之 ...
- visualvm工具远程对linux服务器上的JVM虚拟机进行监控与调优
文/朱季谦 最近在做了一些JVM监控与调优的事情,算是第一次实践,还比较陌生,故而先把这一次经验简单记下笔记,这样,对后面学习调优方面时,不至于又想不起来了.本文档主要总结在window本地环境远程对 ...
- jvm参数设置和性能调优
1.Java虚拟机运行时的数据区 2.常用的内存区域调节参数 -Xms:初始堆大小,默认为物理内存的1/64(<1GB):默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40% ...
- spark系列-7、spark调优
官网说明:http://spark.apache.org/docs/2.1.1/tuning.html#data-serialization 一.JVM调优 1.1.Java虚拟机垃圾回收调优的背景 ...
- JVM内存模型与性能调优
堆内存(Heap) 堆是由Java虚拟机(JVM,下文提到的JVM特指Sun hotspot JVM)用来存放Java类.对象和静态成员的内存空间,Java程序中创建的所有对象都在堆中分配空间,堆只用 ...
随机推荐
- Oracle快速建表Sample
表定义: create table tb_triple( id number(8,0) primary key, name nvarchar2(20), birthday date ) 充值: ins ...
- 原生 Java 客户端进行消息通信
原生 Java 客户端进行消息通信 Direct 交换器 DirectProducer:direct类型交换器的生产者 NormalConsumer:普通的消费者 MulitBindConsumer: ...
- 详解 LeetCode_007_整数反转(Java 实现)
目录 LeetCode_007_整数反转 题目描述 总体分析 解决方案 小结 LeetCode_007_整数反转 题目描述 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示 ...
- 记一次奇怪的cookie丢失
.net给Image控件设置一个空图片路径的时候出现丢失cookie 比如说, img_path.ImageUrl ="../"+ ds.Tables[0].Rows[0][&q ...
- nginx系列(七)静态文件合并combo
根据雅虎性能优化准则,可以将大量的小型JS文件进行合并,用来提高WEB服务器的性能.下面就是笔者的一个实践. 目前必须安装在1.4.+才可以 官方:http://wiki.nginx.org/Http ...
- 一文带你了解Sql优化
我们后台开发人员每天都难免与数据库打交道,那么你在写sql语句的时候有注重到自己sql的效率吗?当你sql查询速度很慢的时候你有想过是你的sql语句造成的吗?看完这篇文章,我相信你会对sql优化有了一 ...
- java oop 修饰符&关键字
一.修饰符 Java中四种访问权限修饰符: private 缺省(default) protected public 修饰类的成员,用来限定对象对该类成员的访问权限. 修饰符 类内部 同一个包 不同包 ...
- Node.js使用npm安装模块太慢,解决办法
转自 淘宝 npm 地址: http://npm.taobao.org/ 如何使用 有很多方法来配置npm的registry地址,下面根据不同情境列出几种比较常用的方法.以淘宝npm镜像举例: 1.临 ...
- 深度神经网络conda环境下载
介绍 因为使用conda下载数据有时候因为网络问题下载非常慢,因此我把conda的环境备份好,到时可以直接使用conda的conda create -n 新环境名字 –clone 环境的路径 , 直接 ...
- Java面试之Java基础问题答案口述整理
Java面试之基础问题答案口述整理 面向对象的理解 面向对象思想就是在计算机程序设计过程中,把具体事物的属性特性和行为特征抽象出来,描述成计算机事件的设计思想.它区别于面向过程的思想,强调的是通过调用 ...