代码编织梦想

9.2. GC日志

1)特别说明
每种垃圾回收器的日志格式是不同的
2)实际生产中日志参数设置
在实际生产中要保存的日志格式如下所示,至少需要包含以下内容:
-Xloggc:/opt/xxx/logs/xxx-xxx-gc-%t.log 设置日志的保存位置
-XX:+UseGCLogFileRotation 设置日志循环保存
-XX:NumberOfGCLogFiles=5 设置使用5个日志文件
-XX:GCLogFileSize=20M 设置每个日志文件的大小为20M
-XX:+PrintGCDetails 设置每个日志文件中要打印GC信息
-XX:+PrintGCDateStamps 设置在每次GC时打印时间信息
-XX:+PrintGCCause 设置每次GC时的原因

9.2.1. Parallel Old垃圾回收器的日志

这里以Parallel Old垃圾回收器的日志为例,进行介绍:

3)堆的内存日志信息

其中,新生代的total大小记录的是Eden区和survivor1或survivor2区的大小,并不是Eden区、survivor1和survivor2区的大小。

9.2.2. CMS垃圾回收器的日志

1)指定CMS的命令行指令
在linux系统下指定CMS作为垃圾回收器的执行命令:java -Xms最小堆大小 -Xmx最大堆大小 -XX:+PrintGCDetails -XX:+UseConcMarkSweepGC 文件名。例如,java -Xms20M -Xmx20M -XX:+PrintGCDetails -XX:+UseConcMarkSweepGC com.mashibing.jvm.gc.T15_FullGC_Problem01
2)CMS日志-年轻代部分
通过UseConcMarkSweepGC参数指定使用ParNew和CMS作为组合垃圾回收器使用,所以在年轻代进行垃圾回收时,是ParNew进行垃圾回收。

3)CMS日志-老年代部分
老年代采用CMS进行垃圾回收,在初始标记阶段耗时时间最长。

a.在初始标记阶段,8511 (13696) 为老年代使用的最大内存空间,9866 (19840) 为整个堆使用的最大空间。
b.在并发标记阶段,时间意义不大,因为是并发执行。
c.在重新标记阶段中, YG occupancy为年轻代占用及容量,[Rescan (parallel)为STW下的存活对象标记,weak refs processing为弱引用处理,class unloading为卸载用不到的class,scrub symbol(string) table为cleaning up symbol and string tables which hold class-level metadata and internalized string respectively,CMS-remark: 8511K(13696K)为阶段过后的老年代占用及容量,10108K(19840K)为阶段过后的堆占用及容量。
d.在并发清除阶段中,标记已经完成,进行并发清理。
e.在并发重置阶段中,重置内部结构,为下次GC做准备。

9.2.3. G1垃圾回收器的日志

G1的日志如下所示,其中每一部分代表意义均添加在里面了。
[GC pause (G1 Evacuation Pause) (young) (initial-mark), 0.0015790 secs]
//young -> 年轻代 Evacuation-> 复制存活对象
//initial-mark 混合回收的阶段,这里是YGC混合老年代回收
[Parallel Time: 1.5 ms, GC Workers: 1] // GC Workers表示只有一个GC线程
[GC Worker Start (ms): 92635.7]
[Ext Root Scanning (ms): 1.1] // 寻找GC Roots
[Update RS (ms): 0.0] // 更新RSet
[Processed Buffers: 1]
[Scan RS (ms): 0.0] // 扫描RSet
[Code Root Scanning (ms): 0.0]
[Object Copy (ms): 0.1] // 对象拷贝
[Termination (ms): 0.0]
[Termination Attempts: 1]
[GC Worker Other (ms): 0.0]
[GC Worker Total (ms): 1.2]
[GC Worker End (ms): 92636.9]
[Code Root Fixup: 0.0 ms]
[Code Root Purge: 0.0 ms]
[Clear CT: 0.0 ms]
[Other: 0.1 ms]
[Choose CSet: 0.0 ms]
[Ref Proc: 0.0 ms]
[Ref Enq: 0.0 ms]
[Redirty Cards: 0.0 ms]
[Humongous Register: 0.0 ms]
[Humongous Reclaim: 0.0 ms]
[Free CSet: 0.0 ms]
[Eden: 0.0B(1024.0K)->0.0B(1024.0K) Survivors: 0.0B->0.0B Heap: 18.8M(20.0M)->18.8M(20.0M)]
[Times: user=0.00 sys=0.00, real=0.00 secs]
//以下是混合回收其他阶段
[GC concurrent-root-region-scan-start]
[GC concurrent-root-region-scan-end, 0.0000078 secs]
[GC concurrent-mark-start]
//无法evacuation,进行FGC
[Full GC (Allocation Failure) 18M->18M(20M), 0.0719656 secs]
[Eden: 0.0B(1024.0K)->0.0B(1024.0K) Survivors: 0.0B->0.0B Heap: 18.8M(20.0M)->18.8M(20.0M)], [Metaspace: 38
76K->3876K(1056768K)] [Times: user=0.07 sys=0.00, real=0.07 secs]

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/Waiting_Mr_Liu/article/details/111086927

JDBC入门-爱代码爱编程

JDBC入门 JDBC全称:Java DataBase Connectivity;是由SUN公司提供的一套通用的Java连接数据的标准(接口),这套接口用于屏蔽数据库之间的差异(方言),使得Java程序员可以专注于处理数据而不需要考虑数据库之间的差异; 入门案例: // 1.加载数据库驱动 Class.forName("com.mysql.jdbc.

过端口 1433 连接到主机XXX.XX.XX.XX 的 TCP/IP 连接失败。错误:“connect timed out。请验证连接属性。确保 SQL Server 的实例正在主机上运行,且在此端-爱代码爱编程

每一次写点东西都会遇到问题,今天本来想要用jdbc连接我的服务器上的数据库然后没有任何意外的出错“通过端口 1433 连接到主机XXX.XX.XX.XX 的 TCP/IP 连接失败。错误:“connect timed out。请验证连接属性。确保 SQL Server 的实例正在主机上运行,且在此端口接受 TCP/IP 连接,还要确保防火墙没有阻止到此端口

动态规划:分组背包问题-爱代码爱编程

文章目录 往期题目解题思路空间优化Reference 本篇文章已同步更新至github仓库JavaSummary,欢迎star! 往期 01背包问题完全背包问题多重背包问题I多重背包问题II混合背包问题二维费用背包问题题目 分组背包问题 有 N

spring核心之IOC控制反转-爱代码爱编程

2020.9.9spring中转控制IOC学习笔记 IOC的概念: IOC意思是具有依赖注入功能的容器, 是可以创建对象的容器,IOC容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。通常new一个实例,控制权由程序员控制,而"控制反转"是指new实例工作不由程序员来做而是交给Spring容器来做。。在Spring中BeanFactor

Java中Collections工具类的使用-爱代码爱编程

Collections工具类 1.作用: Collections 是一个操作 Set、List 和 Map 等集合的工具 2.常用方法: reverse(List):反转 List 中元素的顺序shuffle(List):对 List 集合元素进行随机排序sort(List):根据元素的自然顺序对指定 List 集合元素升序排序sort(List,

最小的K个数-爱代码爱编程

题目: 输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。 示例1 输入:[4,5,1,6,2,7,3,8],4 返回值:[1,2,3,4] 思路: 刚看到这道题的时候,脑海中浮现的就是Redis,通过一个缓存,不断更替其中的热点数据但其实这道题有很多种解法,既可以in-

执行引擎、JIT、逃逸分析-爱代码爱编程

执行引擎就是 JVM运行Java程序的一套子系统 Java是半编译半解释型语言 如果面试官问你这个问题,要分成两个角度来讲解 ​ 1、javac编译,java运行 ​ 2、运行期即时编译+解释执行(字节码解释器解释执行,模板解释器编译执行) 两种解释器的底层实现 JVM中目前来说有两种解释器 具体细节见课堂上操作实战 1、字节码解释器

作为运维,你需要了解的jvm知识点-爱代码爱编程

作为运维,处理最多的可能就是系统的一些内存报错了,所以整理一下jvm方面的知识点,希望各位读完本篇文章,对jvm能有一个基本的了解   推荐公众号,分享运维知识:龙叔18岁 1·概括 堆是堆(heap),栈是栈(stack),堆栈是栈(这个经常会让新手误会) 1.1·内存结构图 下面几个图是我在网上看到的很棒的jvm内存的概括图

字节码指令(下篇)-爱代码爱编程

上一篇 控制转移指令 程序流程离不开条件控制,为了支持条件跳转,虚拟机提供了大量字节码指令,大体上可以分为 1)比较指令、2)条件跳转指令、3)比较条件跳转指令、4)多条件分支跳转指令、5)无条件跳转指令等。 比较指令 ,比较指令的作用是比较栈顶两个元素的大小,并将比较结果入栈。 ●比较指令有: dcmpg, dcmpl、 fcmpg、fcmpl

Spring Boot 打包上传至 Docker 仓库?-爱代码爱编程

重要提示:学习本文之前需要提前了解docker容器相关的知识,了解和熟练运用常用的docker操作命令,如果已经了解了docker容器相关的知识那我们就开搞吧! 以下是完成标题所述功能的大致步骤: 搭建docker镜像仓库修改Spring Boot 配置文件添加docker仓库配置,打包,上传至docker 镜像仓库从自己搭的docker镜像仓库

Integer比较问题和JDK缓存设计-爱代码爱编程

文章目录 Integer比较问题比较对象的值要用equals方法为什么a==1024又是true?总结问题还没结束...一定要用equals吗?JDK缓存机制填坑:为什么IntegerCache类的high不是一开始就赋值了?总结扩展知识:享元设计模式 Integer比较问题 今天旁边搞.net的同事问我,为什么Java中Integer比较得

JVM最多支持多少个线程?-爱代码爱编程

来自:脚本之家 链接:https://www.jb51.net/article/49087.htm McGovernTheory在StackOverflow提了这样一个问题: Java虚拟机最多支持多少个线程?跟虚拟机开发商有关么?跟操作系统呢?还有其他的因素吗? Eddie的回答: 这取决于你使用的CPU,操作系统,其他进程正