CMS日志

news/2023/12/1 8:44:47 标签: 数据结构与算法, 操作系统, java

1. GC参数配置

-XX:+PrintGC

输出GC日志。

-verbose:gc

可以认为 -verbose:gc-XX:+PrintGC 的别名。

-Xloggc:log/gc.log

输出GC日志的存储路径。

-XX:+PrintGCDetails

输出GC的详细日志。

-XX:+PrintGCDateStamps

输出GC的时间戳(以日期的形式)。

-XX:+ExplicitGCInvokesConcurrent

无论什么时候调用系统GC,都执行CMS GC,而不是Full GC。

-XX:+PrintHeapAtGC

在进行GC的前后打印出堆的信息。

-Xms512m

设置初始堆的大小。

-Xmx512m

堆分配的最大空间。

-Xmn1024m

设置年轻代大小。

整个JVM内存大小 = 年轻代大小 + 年老代大小 + 持久代大小,持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。

-Xss320K

设置每个线程的堆栈大小。

JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。根据应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。

-XX:+UseConcMarkSweepGC

使用CMS收集器,其它类似。

-XX:NewRatio=4

设置年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代)。设置为4,则年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5,默认值是2即老年代是新生代内存的2倍

-XX:SurvivorRatio=4

设置年轻代中Eden区与Survivor区的大小比值。设置为4,则两个Survivor区与一个Eden区的比值为2:4,一个Survivor区占整个年轻代的1/6,默认值为8。

-XX:MaxPermSize=16m

设置持久代大小为16m。

-XX:MaxTenuringThreshold=0

设置垃圾最大年龄。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概论。

GC[Allocation Failure]表示向young generation(eden)给新对象申请空间,但是young generation(eden)剩余的合适空间不够所需的大小导致的minor gc。

2. Minor GC: UseParNewGC 回收日志

2018-12-29T14:39:40.102+0800: 3.856: [GC (Allocation Failure) 2018-12-29T14:39:40.102+0800: 3.856: [ParNew: 681600K->72044K(766784K), 0.0977206 secs] 681600K->72044K(4109120K), 0.0978554 secs] [Times: user=0.39 
sys=0.06, real=0.10 secs]

2018-12-29T14:39:40.102+0800 本次gc触发的时间;

3.856 jvm启动后所经历的秒数;

GC (Allocation Failure) 对象分配在新生代但空间不够导致触发一次新生代gc;

ParNew 表示这是新生代gc类型, 即ParNewGC;

681600K->72044K(766784K), 0.0977206 secs 触发新生代gc时年轻代堆的大小,回收后的年轻代堆的大小,年轻代堆的总大小,该次gc回收所耗费的时间;

681600K->72044K(4109120K) 回收前堆的总大小,回收后堆的总大小,堆的总大小。

3. Major GC: UseConcMarkSweepGC 垃圾收集

CMS垃圾收集器总共分为7个阶段,其中有2个阶段,即是初始标记和最终标记阶段,是需要暂停用户线程的,其余垃圾收集线程均与用户线程并发执行。

CMS垃圾收集器在新版本的 Java 中被标记为弃用,后续的垃圾收集器默认使用G1GC。但目前很大一部分的垃圾收集器依然是CMS,故需要了解一下CMS垃圾收集的一些流程。

3.1 Phase 1: Initial Mark 初始标记

2018-12-29T14:46:45.247+0800: 429.000: [GC (CMS Initial Mark) [1 CMS-initial-mark: 17305K(3342336K)] 607785K(4109120K), 0.0704856 secs] [Times: user=0.32 sys=0.10, real=0.07 secs] 

这是CMS中两次stop-the-world事件中的一次。它有两个目标:一是标记老年代中所有的GC Roots;二是标记被年轻代中活着的对象引用的对象;

[1 CMS-initial-mark 收集阶段,开始收集所有的GC Roots和直接引用到的对象;

17305K(3342336K) 当前老年代的使用情况,老年代可用容量;

607785K(4109120K) 当前整个堆的使用情况,整个堆的容量,即是整个堆 - 老年代 = 新生代(4109120 - 3342336 = 766784)。

3.2 Phase 2: Concurrent Mark 并发标记

2018-12-29T14:46:45.317+0800: 429.071: [CMS-concurrent-mark-start]
2018-12-29T14:46:45.326+0800: 429.080: [CMS-concurrent-mark: 0.009/0.009 secs] [Times: user=0.02 sys=0.00, real=0.01 secs]

这个阶段会遍历整个老年代并且标记所有存活的对象,从“初始化标记”阶段找到的GC Roots开始。并发标记的特点是和应用程序线程同时运行。并不是老年代的所有存活对象都会被标记,因为标记的同时应用程序会改变一些对象的引用等;

CMS-concurrent-mark 并发收集阶段,这个阶段会遍历整个年老代并且标记活着的对象。

0.009/0.009 secs 展示该阶段持续的时间和时钟时间。

3.3 Phase 3: Concurrent Preclean 并发预清除

2018-12-29T14:46:45.326+0800: 429.080: [CMS-concurrent-preclean-start]
2018-12-29T14:46:45.338+0800: 429.092: [CMS-concurrent-preclean: 0.012/0.012 secs] [Times: user=0.02 sys=0.00, real=0.01 secs]

这个阶段又是一个并发阶段,和应用线程并行运行,不会中断他们。前一个阶段在并行运行的时候,一些对象的引用已经发生了变化,当这些引用发生变化的时候,JVM会标记堆的这个区域为Dirty Card(包含被标记但是改变了的对象,被认为"dirty"),这就是 Card Marking;

在pre-clean阶段,那些能够从dirty card对象到达的对象也会被标记,这个标记做完之后,dirty card标记就会被清除了;

一些必要的清扫工作也会做,还会做一些final remark阶段需要的准备工作;

CMS-concurrent-preclean 这个阶段负责前一个阶段标记了又发生改变的对象标记。

3.4 Phase 4: Concurrent Abortable Preclean 可终止的并发预清理

2018-12-29T14:46:45.338+0800: 429.092: [CMS-concurrent-abortable-preclean-start]
CMS: abort preclean due to time 2018-12-29T14:46:50.484+0800: 434.238: [CMS-concurrent-abortable-preclean: 4.232/5.146 secs] [Times: user=5.49 sys=0.10, real=5.15 secs] 

又一个并发阶段不会停止应用程序线程。这个阶段尝试着去承担STW的Final Remark阶段足够多的工作。这个阶段持续的时间依赖好多的因素,由于这个阶段是重复的做相同的事情直到发生aboart的条件(比如:重复的次数、多少量的工作、持续的时间等等)之一才会停止;

CMS-concurrent-abortable-preclean 可终止的并发预清理;

这个阶段很大程度的影响着即将来临的Final Remark的停顿,有相当一部分重要的 configuration options 和 失败的模式。

3.5 Phase 5: Final Remark 最终标记

2018-12-29T14:46:50.485+0800: 434.239: [GC (CMS Final Remark) [YG occupancy: 632074 K (766784 K)]2018-12-29T14:46:50.485+0800: 434.239: [Rescan (parallel) , 0.0791637 secs]2018-12-29T14:46:50.564+0800: 434.318: 
[weak refs processing, 0.0001243 secs]2018-12-29T14:46:50.565+0800: 434.318: [class unloading, 0.0409380 secs]2018-12-29T14:46:50.605+0800: 434.359: [scrub symbol table, 0.0136356 secs]2018-12-29T14:46:50.619+08
00: 434.373: [scrub string table, 0.0015586 secs][1 CMS-remark: 17305K(3342336K)] 649380K(4109120K), 0.1370772 secs] [Times: user=0.46 sys=0.06, real=0.13 secs] 

这个阶段是CMS中第二个并且是最后一个STW的阶段。该阶段的任务是完成标记整个年老代的所有的存活对象。由于之前的预处理是并发的,它可能跟不上应用程序改变的速度,这个时候,STW是非常需要的来完成这个严酷考验的阶段;

通常CMS尽量运行Final Remark阶段在年轻代是足够干净的时候,目的是消除紧接着的连续的几个STW阶段;

CMS Final Remark 收集阶段,这个阶段会标记老年代全部的存活对象,包括那些在并发标记阶段更改的或者新创建的引用对象;

YG occupancy: 632074 K (766784 K) 年轻代当前占用的情况和容量;

Rescan (parallel) 这个阶段在应用停止的阶段完成存活对象的标记工作;

weak refs processing 第一个子阶段,随着这个阶段的进行处理弱引用;

class unloading 第二个子阶段, 类的卸载;

scrub symbol table 最后一个子阶段, 清理字符引用等;

1 CMS-remark: 17305K(3342336K) 在这个阶段之后老年代占有的内存大小和老年代的容量;

649380K(4109120K) 在这个阶段之后整个堆的内存大小和整个堆的容量;

通过以上5个阶段的标记,老年代所有存活的对象已经被标记并且现在要通过Garbage Collector采用清扫的方式回收那些不能用的对象了。

3.6 Phase 6: Concurrent Sweep 并发清除

2018-12-29T14:46:50.622+0800: 434.376: [CMS-concurrent-sweep-start]
2018-12-29T14:46:50.635+0800: 434.388: [CMS-concurrent-sweep: 0.012/0.012 secs] [Times: user=0.02 sys=0.00, real=0.02 secs] 

和应用线程同时进行,不需要STW。这个阶段的目的就是移除那些不用的对象,回收他们占用的空间并且为将来使用;

CMS-concurrent-sweep 这个阶段主要是清除那些没有标记的对象并且回收空间。

3.7 Phase 7: Concurrent Reset 并发重置

2018-12-29T14:46:50.635+0800: 434.388: [CMS-concurrent-reset-start]
2018-12-29T14:46:50.651+0800: 434.405: [CMS-concurrent-reset: 0.016/0.016 secs] [Times: user=0.01 sys=0.00, real=0.01 secs] 

这个阶段并发执行,重新设置CMS算法内部的数据结构,准备下一个CMS生命周期的使用;

CMS-concurrent-reset 这个阶段重新设置CMS算法内部的数据结构,为下一个收集阶段做准备;

可参考JVM调优——之CMS GC日志分析。


http://www.niftyadmin.cn/n/703898.html

相关文章

mac使用Fiddler实现ios抓包

目录 前言 一、什么是Fiddler? 二、下载 三、使用 前言 windows同理,只是下载的版本不一样 2021/07/29更新: Fiddler要收费了,改用proxyman工具,使用方式:https://blog.csdn.net/lalasi11/article/de…

安装mongo,新建数据库,添加普通用户

1. 使用docker安装mongo 官方文档 docker-compose.yml文件内容: version: 3.1services:mongo:container_name: mongoimage: mongonetwork_mode: hostrestart: alwaysvolumes:- ./data:/data/dbenvironment:MONGO_INITDB_ROOT_USERNAME: rootMONGO_INITDB_ROOT_PASSW…

浙政钉应用接入

目录 前言 一、申请入驻政务钉钉开放平台 二、接口开发联调测试 1.免登流程 2.免登整体思路 3.免登对接 4.应用实现 三、申请转入正式环境 四、正式环境应用调试 五、应用正式上架 前言 本文主要是记录以 REST 形式调用浙政钉接口的记录 一、申请入驻政务钉钉开放平…

浙里办应用接入

目录 前言 一、创建应用 二、用户体系接入 1、提交用户信息对接申请 2、用户体系对接 三、通知服务对接 前言 整体流程可参考官方接入文档(“浙里办”h5微应用接入流程 对接组),本文只针对h5应用对接浙里办的用户体系做一个简单记录 …

echart与ajax 获取动态数据

//引入echart.js<script src"assets/dist/echarts.js"></script><div class"t_Record" style"width: 100%;overflow: hidden;"><div id"main" style"height:400px; overflow:hidden; width:100%;/* overfl…

SpringBoot启动提示找不到或无法加载主类

最近遇到一个码云项目&#xff0c;clone 下来后其目录结构存在多层&#xff0c;即最外层的目录进去后并不是主项目工程&#xff08;真是恶心&#xff09;&#xff0c;起初还能编译并顺利运行&#xff0c;但是在debug调试的时候发现调试点与代码总是对不起来&#xff0c;清了下缓…

写给社区的回顾和展望:TiDB 2019, Level Up !

作者&#xff1a;黄东旭 2018 年对于 TiDB 和 PingCAP 来说是一个由少年向成年的转换的一年&#xff0c;如果用一个关键字来概括就是「蜕变」。在这一年很欣喜的看到 TiDB 和 TiKV 在越来越多的用户使用在了越来越广泛的场景中&#xff0c;作为一个刚刚 3 岁多的开源项目&#…

git 报错 LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to github.com:443

github上的项目在进行 git pull 或 git clone 时出现该报错&#xff0c;在确认网络还行且能科学上网的前提下&#xff0c;列出如下解决方式&#xff1a; 方法一&#xff1a; 可能由于 ipv6 引起&#xff0c;执行 networksetup -setv6off Wi-Fi &#xff08;第一次使用方法一…

Mybatis-plus打印完整执行sql

目录 前言 使用 效果 前言 如果你恰好使用 Mybatis-plus 框架&#xff0c;那么在开发环境就不能错过它提供的 PerformanceInterceptor 插件&#xff0c;该插件能打印 sql 执行时间以及完整的 sql 语句&#xff0c;非常方便复制出来分析 sql 使用 这里使用的 Mybatis-plu…

linux下tar.gz、tar、bz2、zip等解压缩、压缩命令

一、Linux下最常用的打包程序就是tar 使用tar程序打出来的包我们常称为tar包&#xff0c;tar包文件的命令通常都是以.tar结尾的。生成tar包后&#xff0c;就可以用其它的程序来进行压缩了&#xff0c;所以首先就来讲讲tar命令的基本用法&#xff1a; # tar -cf all.tar *.jpg …

三分钟学会.NET微服务之Polly

熔断降级是一个非常重要的概念&#xff0c;我们先说一下什么是熔断降级&#xff0c;咱们都知道服务发现&#xff0c;一个有问题的服务器没来得急注销过一会就崩溃掉了&#xff0c;那么我们的请求就有可能访问一个已经崩溃的服务器&#xff0c;那么就会请求失败&#xff0c;因为…

mac安装pip

目录 前言 安装 安装后 前言 pip是常用的python包管理工具&#xff0c;虽然mac自带了2.7的python&#xff0c;但pip需要我们手动安装&#xff0c;不过easy_install.py是默认安装的&#xff0c;因此我们可以使用他进行操作 安装 首先进入到python的路径下&#xff0c;可使…

跨域测试与解决

目录 前言 浏览器的同源策略 如何允许跨域访问 如何验证后端服务是否跨域 java后端支持跨域配置 前言 一直想写的一个自用cv工程一直懒得写&#xff0c;本文主要目的是存放java后台开启跨域配置代码&#xff0c;用于复制&#xff0c;顺便整理一下笔记中的跨域内容 浏览器…

Windows 10 超过Windows 7成为最受欢迎的操作系统

新年伊始&#xff0c;Net Marketshare的一项对操作系统的调查显示Windows10现在是最受欢迎的操作系统。这是Windows 10正式推出三年半以来首次登上操作系统占有份额的榜首。 调查结果显示&#xff0c;目前Windows 10的占有份额为39.22%。Windows 10不是一夜之间崛起的&#xff…

微信公众号迁移方案

目录 前言 腾讯迁移 新公众号相关 openid转换 关于unionid 注意事项 前言 迁移总共分为两个步骤&#xff0c;一个是腾讯方面完成两个公众号的数据迁移&#xff0c;另外一个是完成数据库中openid的转换 腾讯迁移 大概步骤如下&#xff1a; 提前准备阶段&#xff0c;需…

DELL服务器突然无法进入操作系统,怎么处理?是不是有以下描述的原因?

硬件环境&#xff1a;一台DELL服务器T430&#xff08;双C/16G/4块300G /H310阵列卡&#xff0c;做了RAID5&#xff09;软件环境&#xff1a;已有Server 某版本操作系统&#xff0c;有财务软件需要解决的问题&#xff1a;服务器开机进不了系统&#xff0c;公司财务数据面临丢失风…
最新文章