一、 JDK工具

1.1 内置命令行工具

工具 简介
jps/jinfo 查看java进程
jstat 查看JVM内部GC信息
jmap 查看JVM堆或类占用空间信息
jstack 查看线程信息
jcmd 整合性的命令
jrunscript/jjs 执行js命令

1. jps

查看运行的java进程

jps

查看详细的java进程信息

jps -mlv

2. jstat

查看gc详细信息

jstat -gc pid 1000 100

pid可以根据jps命令得到,参数里的1000代表每1000毫秒统计一次,100代表统计100次

查看gc相关区域的使用率

jstat -gcutil pid 1000 100

3. jmap

查看堆内存

jmap -heap pid

jmap -histo pid

jmap -dump:format=b,file=xx.hprof

pid

4. jstack

查看线程的情况

jstack -l pid

5. jcmd

综合命令,能查看堆、线程等情况

jcmd pid VM.version

jcmd pid VM.flags

jcmd pid VM.command_line

jcmd pid VM.system_properties

jcmd pid Thread.print

jcmd pid GC.class_histogram

jcmd pid GC.heap_info

6. jrunscript/jjs

可以运行js脚本

jrunscript -e "print('abc')"

jrunscript -l js -f test.js

1.2 JDK内置图形化工具

可自行下载了解

  1. jconsole
  2. jvisualvm
  3. VisualGC
  4. jmc

二、GC的背景与原理

2.1 识别存活对象

怎么判断对象没有引用了呢?

引用计数 -> 引用跟踪

引用计数:

引用计数的方法,无法循环调用的情况。如A调用B,B调用C,C调用A。这样他的引用计数永远不会为0,也就不能被回收。

引用跟踪:

根据一些GC ROOT对象,向下寻找他们引用的对象。

可以作为GC ROOT的对象:

  • 当前正在执行的方法里的局部变量和输入参数
  • 活动线程
  • 所有类的静态字段
  • JNI引用

2.2 GC算法

  1. 清除算法

标记 - 清除

  1. 复制算法

标记 - 复制

  1. 整理算法

标记 - 清除 - 整理

2.3 垃圾回收器

1. Serial GC /ParNew GC

-XX:+UseSerialGC 配置串行 GC

Serial GC,也叫串行GC。年轻代使用复制算法,老年代使用整理算法。两者都是单线程的垃圾收集器,所以整个过程都是Stop-The-World。这种垃圾回收器适用于几百MB的堆内存,并且单核CPU时比较有用。

ParNew GC是Serial GC的多线程版本,一般是配合CMS使用。

2. Parallel GC

-XX:+UseParallelGC -XX:+UseParallelOldGC

也叫并行GC,年轻代使用复制算法,老年代使用整理算法。可以通过

-XX:ParallelGCThreads=N 来指定 GC 线程数, 其默认值为 CPU 核心数

并行GC适用于多核服务器,主要目标是增加吞吐量。

  • 在GC期间,所有CPU内核都在并发清理垃圾,所以总暂停时间会更短
  • 在两次GC周期的间隔期,没有GC线程在运行,不会消耗任何线程资源
3. CMS

-XX:+UseConcMarkSweepGC

采用的标记清除算法。CMS的设计目标是避免长时间的卡顿。主要通过两种手段达成目标

  • 不对老年代进行整理,而是使用空闲列表管理内存空间的回收
  • 在标记-清除阶段的大部分工作和应用线程是一起并发执行的。

CMS清理的六个阶段

  • 初始标记 标记根对象和根对象直接引用的对象
  • 并发标记 从前一阶段找到的根对象算起,标记所有存活对象
  • 并发预清理 因为是并发执行的,所以过程中可能有一些引用发生改变,JVM会通过Card的方式需要标记一下,这就是所谓的卡片标记
  • 最终标记 本阶段的目标是完成所有对象的标记。
  • 并发清除 删除不再使用的对象
  • 并发重置 重置CMS算法的内部数据,为下一次GC循环做准备。
4. G1 GC

-XX:+UseG1GC -XX:MaxGCPauseMillis=50

G1的全称是Garbage-First,意为垃圾优先,哪一块垃圾最多就优先清理哪一块。

G1的设计目标是将STW的时间变成可预期且可配置的。

他不将堆分为年轻代和老年代,而是划分为多个(通常是2048)可以存放对象的小块区域.每个小块,可能一会被定义为Eden区,一会被定义为老年代。

这样划分之后,G1就可以不必每次都去收集整个堆空间,而是以增量的方式处理。

G1清理的阶段

  • 初始标记 此阶段标记所有从GC根对象直接可达的对象。
  • Root区扫描 标记从根区域可达的对象
  • 并发标记
  • 再次标记
  • 清理

-XX:G1NewSizePercent:初始年轻代占整个 Java Heap 的大小,默认值为 5%;

-XX:G1MaxNewSizePercent:最大年轻代占整个 Java Heap 的大小,默认值为 60%;

-XX:G1HeapRegionSize:设置每个 Region 的大小,单位 MB,需要为 1,2,4,8,16,32 中的某个值,默 认是堆内存的 1/2000。如果这个值设置比较大,那么大对象就可以进入 Region 了。

-XX:ConcGCThreads:与 Java 应用一起执行的 GC 线程数量,默认是 Java 线程的 1/4,减少这个参数的数值可 能会提升并行回收的效率,提高系统内部吞吐量。如果这个数值过低,参与回收垃圾的线程不足,也会导致并行回收机制耗时加长。

-XX:+InitiatingHeapOccupancyPercent(简称 IHOP):G1 内部并行回收循环启动的阈值,默认为 Java Heap 的45%。这个可以理解为老年代使用大于等于 45% 的时候,JVM会启动垃圾回收。这个值非常重要,它决定了在什么时间启动老年代的并行回收。

-XX:G1HeapWastePercent:G1停止回收的最小内存大小,默认是堆大小的 5%。GC 会收集所有的Region 中 的对象,但是如果下降到了5%,就会停下来不再收集了。就是说,不必每次回收就把所有的垃圾都处理完,可以遗留少量的下次处理,这样也降低了单次消耗的时间

-XX:+GCTimeRatio:这个参数就是计算花在 Java 应用线程上和花在 GC 线程上的时间比率,默认是 9,跟新生代内存的分

配比例一致。这个参数主要的目的是让用户可以控制花在应用上的时间,G1的计算公式是100/(1+GCTimeRatio)。这样如果参数设置为 9,则最多 10% 的时间会花在 GC工作上面。ParallelGC的默认值是 99,表示 1% 的时间被用在 GC 上面,

这是因为 Parallel GC 贯穿整个 GC,而 G1 则根据 Region来进行划分,不需要全局性扫描整个内存堆。

-XX:+UseStringDeduplication:手动开启 Java String 对象的去重工作,这个是 JDK8u20 版本之后新增的参数,主要用于

相同 String 避免重复申请内存,节约 Region 的使用。

-XX:MaxGCPauseMills:预期 G1 每次执行 GC 操作的暂停时间,单位是毫秒,默认值是 200 毫秒,G1 会尽量保证控制在

这个范围内

5. ZGC

-XX:+UnlockExperimentalVMOptions -XX:+UseZGC -Xmx16g

主要特点:

  1. GC最大停顿时间不超过10ms
  2. 堆内存支持区域广,小到几百M,大到4TB
  3. 与G1相比,应用吞吐量有下降,但不超过15%
  4. JDk15前仅支持Linux系统

通过着色指针和读屏障,实现几乎全部的并发执行,几毫秒级别的延迟,线性可扩展;

多个垃圾回收器对比

GC如何选择?

选择正确的GC算法,唯一可行的方式就是实践,一般性的指导准则是:

  1. 如果考虑吞吐量优先,CPU资源最大程度的处理业务,用Parallel GC
  2. 如果考虑系统低延迟,则用CMS
  3. 如果系统堆内存较大,同时希望平均GC时间可控,使用G1 GC。一般超过4G,算是比较大,超过8G ,比如16G-64G,非常推荐G1 GC

各版本默认垃圾回收器

版本 垃圾回收器
JDK1.7 Parallel
JDK1.8 Parallel
JDK1.9 G1

第一周JVM核心技术-工具与GC策略的更多相关文章

  1. 深入学习重点分析java基础---第一章:深入理解jvm(java虚拟机) 第一节 java内存模型及gc策略

    身为一个java程序员如果只会使用而不知原理称其为初级java程序员,知晓原理而升中级.融会贯通则为高级 作为有一个有技术追求的人,应当利用业余时间及零碎时间了解原理 近期在看深入理解java虚拟机 ...

  2. 关于JVM内存模型,GC策略以及类加载器的思考

    JVM内存模型 Sun在2006年将Oracle JDK开源最终形成了Open JDK项目,两者在绝大部分的代码上都保持一致.JVM的内存模型是围绕着原子性(操作有且仅有一个结果).可见性(racin ...

  3. 【转】JVM 分代GC策略分析

    我们以Sun HotSpot VM来进行分析,首先应该知道,如果我们没有指定任何GC策略的时候,JVM默认使用的GC策略.Java虚拟机是按照分代的方式来回收垃圾空间,我们应该知道,垃圾回收主要是针对 ...

  4. JVM 分代GC策略分析

    JVM 分代GC策略分析   我们以Sun HotSpot VM来进行分析,首先应该知道,如果我们没有指定任何GC策略的时候,JVM默认使用的GC策略.Java虚拟机是按照分代的方式来回收垃圾空间,我 ...

  5. JVM的GC策略

    1 前言 GC(Garbage Collect)是jvm对于内存管理的核心功能,正是因为它才让Java程序员从内存释放的苦海中脱离出来,所以作为一个程序员都有必要去了解一下他的原理. 说一句题外话,我 ...

  6. SQL Server 数据库备份策略,第一周运行失败的原因

    一般生产库,采用 每10分钟备份Log,每天备份Diff,每周备份Full的策略. 同时存在异地备份.异地备份可使用SQL Server本身的cmdshell存储过程,调用系统命令. 在为新数据库,建 ...

  7. JVM内存模型以及HotSpot的GC策略

    概述 想要进一步掌握Java语言,必须要深入了解一下Java程序的运行环境.本文会对JVM的内存模型.Java内存自动管理机制.以及Oracle官方虚拟机HotSpot在GC方面的实现策略进行大概的梳 ...

  8. 吴恩达《深度学习》-第三门课 结构化机器学习项目(Structuring Machine Learning Projects)-第一周 机器学习(ML)策略(1)(ML strategy(1))-课程笔记

    第一周 机器学习(ML)策略(1)(ML strategy(1)) 1.1 为什么是 ML 策略?(Why ML Strategy?) 希望在这门课程中,可以教给一些策略,一些分析机器学习问题的方法, ...

  9. JVM内存模型及垃圾收集策略解析(一)

    JVM内存模型是Java的核心技术之一,之前51CTO曾为大家介绍过JVM分代垃圾回收策略的基础概念,现在很多编程语言都引入了类似Java JVM的内存模型和垃圾收集器的机制,下面我们将主要针对Jav ...

随机推荐

  1. 数字转人民币读法-python3

    """ 2 把一个浮点数分解成证书备份和小数部分 3 """ 4 def divide(num): 5 intnum = int(num) ...

  2. Http请求状态码302,已得到html页面但未跳转?HttpServletRequest转发/HttpServletResponse重定向后,前端页面未跳转?Ajax怎么处理页面跳转?

    论断 出现此类错误,服务器端出现问题的可能性不大,大概率是前端问题. 问题概述 事情是这样的,我在用Java开发后端.前端页面使用jQuery库的 $.getJSON() 方法发送了一个Ajax请求. ...

  3. 利用别名切换索引流程Elasticsearch 7.7

    背景 公司里面现在有es集群,由于时间过长,es集群中的某个索引过大但是未删除,一直在写入的情况下,昨天写入突然停止了,发现是索引超时的问题,这时想到通过创建一个新的索引来进行索引切换 操作 es 集 ...

  4. windows上phpstudy配置memcache

    原文   http://blog.csdn.net/ltx06/article/details/78588448   总的来说,分两步:同时安装memcached软件服务和安装php_memcache ...

  5. 透视HTTP协议,带你拨开纷繁复杂的表象

    一个HTTP,打趴80%面试者! HTTP是一个在计算机世界里专门在两点之间传输文字.图片.音频.视频等超文本数据的约定和规范.如果你不懂HTTP协议,那就相当于是个只有半桶水的程序员. 在这个专栏中 ...

  6. Toolkit 大更新:UI 更美观,用起来更方便!

    前言 前段时间有小伙伴在群里聊天,说到 Toolkit 下载量到 4.9k 了.就突然想起来,很久没有更新这个插件. PS:我是用它申请了 License,一般时候使用 Json 格式化功能. 趁着周 ...

  7. 「一站式」兼容所有云厂商文件存储Spring Boot 实现

    背景 在互联网发展的今天,近乎所有的云厂商都提供对象存储服务.一种海量.安全.低成本.高可靠的云存储服务,适合存放任意类型的文件.容量和处理能力弹性扩展,多种存储类型供选择,全面优化存储成本. 当我们 ...

  8. 【笔记】《算法竞赛入门》习题7-6 UVa12113_重叠的正方形

    title: 习题7-6 UVa12113_重叠的正方形 date: 2021-01-31 19:08:00 categories: 算法竞赛入门 tags: 数据结构 算法 UVa <算法竞赛 ...

  9. 配置Jupyter环境:安装+补全+美化+常用库

    1 Jupyter简介 Jupyter Notebook是一个交互式笔记本,支持运行40多种编程语言,本质是一个Web应用程序,便于创建和共享文学化程序文档,支持实时代码,数学方程,可视化和Markd ...

  10. (十五)VMware Harbor 标签管理

    1. Harbor提供两种标签用来隔离各种资源(目前只有镜像): 全局级别标签: 由系统管理员管理,用于管理整个系统的镜像.它们可以添加到任何项目下的镜像中. 项目级别标签: 由项目管理员或者系统管理 ...