JVM系列笔记目录

  • 虚拟机的基础概念
  • class文件结构
  • class文件加载过程
  • jvm内存模型
  • JVM常用指令
  • GC与调优

GC基础知识

  • 什么是垃圾

​ 没有任何引用指向的一个对象或多个对象(循环引用)

  • 如何找到垃圾

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

什么是根? 注意结合上一篇博客 JVM系列【5】JVM常用指令-运行时数据区进行理解。

  1. 线程栈变量 JVM Stack、native method stack
  2. 静态变量 static refercences in method area、Clazz
  3. 常量池 runtime cosntant pool
  4. JNI指针 c/c++ 指针
  • 常见的垃圾回收算法

    1. 标记清除(mark sweep)

    缺点:位置不连续,产生碎片,效率偏低(需要进行两遍扫描)

    适用情况:算法相对简单,适用于存活对象比较多的情况

    1. 拷贝算法 (copying)

      说明:没有碎片,浪费空间,复制移动对象,需要调整对象引用

      适用情况:适用于存活对象较少的情况 只扫描一次

    2. 标记压缩(mark compact)

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

  • JVM堆内存分代模型(用于分代垃圾回收算法)

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

    分代模型中,分新生代和老年代,比例是1:2

    1. 新生代 = 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 区装不下,直接进入老年代。

    2. 老年代: 存放一些"顽固对象",老年代满了或是分配不下了会触发FCG。

    3. 永久代(Permanent Generation,JDK1.7以前)/元数据区(MetaSpace,JDK1.8以后):存放的是Class文件结构,永久代必须指定大小限制 ,元数据可以设置也可以不设置,无上限(受限于物理内存),字符串常量在1.7以前存放在永久代,1.8以后存放在堆中。

  • 垃圾回收类型和对象分配过程

    1. 垃圾回收类型

      上一个点解释了堆内存分代模型,这里统一下概念:MinorGC=YGC指的是新生代即Y区的垃圾回收,MajorGC=FGC指的是老年代分配不下或是满了发生的GC,包括新生代和老年代。

    2. 对象如何分配

      在之前的博客中 JVM系列【4】内存模型-new Object()面试6连问-对象如何分配,简单提过这一点。

​ 对照流程图,分配过程:

	> 1. new对象后优先在栈上分配,栈上分配的对象`pop`后就消失;
> 2. 是否是大对象(Y区分配不下的对象)?是就分配到O区,O区发生FGC后回收
> 3. 不是大对象,优先分配TLAB(Thread Local Allocation Buffer线程本地分配缓存)上,分配不下就分配到Eden区 。
  1. 了解栈上分配、TLAB、分配担保机制和升代

    1. 哪些对象栈上分配?

      线程私有对象 、无逃逸对象即离开代码块就没有引用的对象、支持标量替换的对象,如类中变量可以用基本变量替换。

    2. 线程本地分配Thread Local Allocation Buffer

      独占eden空间,默认1%;多线程时候不用竞争eden就可以申请空间,提高效率;可分配小对象

    3. 分配担保机制

      在新生代无法分配内存的时候,把新生代的对象转移到老生代,然后把新对象放入腾空的新生代。参考

    4. 对象何时进入老年代?

      超过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的更多相关文章

  1. jvm系列(五):tomcat性能调优和性能监控(visualvm)

    tomcat服务器优化 1.JDK内存优化 根据服务器物理内容情况配置相关参数优化tomcat性能.当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出,并且导致应用服务崩溃.因此一般建议堆的最 ...

  2. JVM系列【6】GC与调优2.md

    JVM系列笔记目录 虚拟机的基础概念 class文件结构 class文件加载过程 jvm内存模型 JVM常用指令 GC与调优 了解HotSpot常用命令行参数 JVM的命令行参数参考: https:/ ...

  3. JVM系列【6】GC与调优5-日志分析

    JVM系列笔记目录 虚拟机的基础概念 class文件结构 class文件加载过程 jvm内存模型 JVM常用指令 GC与调优 主要内容 分析PS.CMS.G1的回收日志,目标使大概能读懂GC日志. 测 ...

  4. jvm系列(六):Java服务GC参数调优案例

    本文介绍了一次生产环境的JVM GC相关参数的调优过程,通过参数的调整避免了GC卡顿对JAVA服务成功率的影响. 这段时间在整理jvm系列的文章,无意中发现本文,作者思路清晰通过步步分析最终解决问题. ...

  5. jvm系列:Java GC 分析

    Java GC就是JVM记录仪,书画了JVM各个分区的表演. 什么是 Java GC Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之 ...

  6. visualvm工具远程对linux服务器上的JVM虚拟机进行监控与调优

    文/朱季谦 最近在做了一些JVM监控与调优的事情,算是第一次实践,还比较陌生,故而先把这一次经验简单记下笔记,这样,对后面学习调优方面时,不至于又想不起来了.本文档主要总结在window本地环境远程对 ...

  7. jvm参数设置和性能调优

    1.Java虚拟机运行时的数据区 2.常用的内存区域调节参数 -Xms:初始堆大小,默认为物理内存的1/64(<1GB):默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40% ...

  8. spark系列-7、spark调优

    官网说明:http://spark.apache.org/docs/2.1.1/tuning.html#data-serialization 一.JVM调优 1.1.Java虚拟机垃圾回收调优的背景 ...

  9. JVM内存模型与性能调优

    堆内存(Heap) 堆是由Java虚拟机(JVM,下文提到的JVM特指Sun hotspot JVM)用来存放Java类.对象和静态成员的内存空间,Java程序中创建的所有对象都在堆中分配空间,堆只用 ...

随机推荐

  1. webapi上传图片的两种方式

    /// <summary>        /// App上传图片        /// </summary>        /// <returns>返回上传图片的 ...

  2. Leetcode 全排列专题(更新ing)

    总览 涉及到的题目有 题号 名字 难度 Leetcode 60 第k个排列 中等 Leetcode 46 全排列 中等 待更新...... Leetcode 46 全排列 题目 基础题 给定一个 没有 ...

  3. SqlAnalyzer1.00源码

    SQL解析的夙愿今天终于完成,但限于SQL远超算术表达式,Json,XML等的复杂度,只是解析了一部分.形成普适性的SQL解析,仍需倾注精力. 代码下载:https://files.cnblogs.c ...

  4. DNS 劫持/污染

    who is dns 劫持 or 污染? 对 劫持 和 污染 这两个名词的理解一直都很混淆,这里就简单的记录一下他俩到底有哪些本质上的区别吧~ DNS 劫持 DNS劫持 即: DNS Hijackin ...

  5. 基础Html重点——防健忘

    一.head标签重点 <head> <meta charset="utf-8"> <title>第二天课</title> <! ...

  6. nginx系列(七)静态文件合并combo

    根据雅虎性能优化准则,可以将大量的小型JS文件进行合并,用来提高WEB服务器的性能.下面就是笔者的一个实践. 目前必须安装在1.4.+才可以 官方:http://wiki.nginx.org/Http ...

  7. 浅谈在win server2012 R2操作系统上安装mysql odbc数据源遇到的问题 -九五小庞

    一,服务器系统 Windows Server 2012 R2 二,安装odbc数据源出现的问题 三,步骤二 中的问题,是因为缺少微软常用运行库.需要安装一下运行库 四,安装odbc数据源 安装MySQ ...

  8. Docker 学习笔记一

    Docker 学习笔记一 1.Docker是什么?         Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源.让开发者打包他们的应用以及依赖包到一 ...

  9. windows和linux开启防火墙时允许特定IP和端口

    windows 1.进入高级安全Windows Defender防火墙,新建规则中选择自定义 2.直接下一步 3.设置协议类型.本地端口选择和端口号 4.设置允许哪些IP访问这个端口,不设置则默认任何 ...

  10. 安装Scrapy提示ERROR: 'xslt-config' 不是内部或外部命令,也不是可运行的程序

    环境:win7.Python 2.7.12.PyCharm 2016.3 Requirement already satisfied (use --upgrade to upgrade): scrap ...