一文学会使用GCeasy——一款超好用的在线分析GC日志的网站

前言

  • 此次的GC分析,用的是ParallelGC的日志
  • JDK1.8

可能很多读者都不知道如何打印出程序的GC日志,下面来介绍分别使用IDEA输出GC日志和直接从Tomcat服务器上输出GC日志。其实这两种方式都使用了同样的JVM命令:

-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:./gc.log

-XX:+PrintGCDetails:表示的是打印GC日志详情
-XX:+PrintGCTimeStamps:表示打印GC时间戳
-Xloggc: ./gc.log:表示在当前目录下生成gc.log文件

使用IDEA输出GC日志

在这里插入图片描述
输出日志结果可以在图中Application server设置的Tomcat 7.0.94中的bin目录下,如图:
在这里插入图片描述

在Tomcat服务器上输出GC日志

将上述设置的JVM参数,配置到Tomcat/bin/catalina.sh中,如图:
在这里插入图片描述
导出结果同样的在tomcat/bin/目录下。

打印出GC日志之后,就可以拿去GCeasy官网上进行GC可视化分析了。下文将详细讲解下GCeasy的图形化分析结果。
进入GCeasy官网之后,选择需要导入的GC日志文件导入即可。
在这里插入图片描述

正文

JVM Heap Size

这一部分分别使用了表格和图形界面来展示了JVM堆内存大小。如图所示:
在这里插入图片描述
左侧分别展示了年轻代的内存分配分配空间大小(Allocated)和年轻代内存分配空间大小的最大峰值(Peek),然后依次是老年代(Old Generation)、元数据区(Meta Space)、堆区和非堆区(Young + Old + Meta Space)总大小。值得注意的是,每一代的最大内存利用率都会超过分配的大小,但是图中的内存分配利用率已经超过了峰值内存了。

Key Performance Indicators

这一部分是关键的性能指标,如图:
在这里插入图片描述

  • Throughput表示的是吞吐量
  • Latency表示响应时间
    • Avg Pause GC Time 平均GC时间
    • Max Pause GC TIme 最大GC时间

Interactive Graphs

在这里插入图片描述
第一部分是Heap after GC,GC后堆的内存图,堆是用来存储对象的,从图中可以看出,随着GC的进行,垃圾回收器把对象都回收掉了,因此堆的大小逐渐增大。

在这里插入图片描述
第二部分是Heap before GC,这是GC前堆的使用率,可以看出随着程序的运行,堆使用率越来越高,堆被对象占用的内存越来越大。

在这里插入图片描述
第三部分是GC Duration Time,就是GC持续时间。从图中可以看到,发生Full GC的时间持续的比较端,而Young GC持续的时间比较长。图中横坐标表示GC发生的时间段,纵坐标表示的是GC持续时间。

在这里插入图片描述
第四部分表示的是GC导致程序停顿持续的时间,一个GC事件的发生具有多个阶段,而不同的垃圾回收器又有不同的阶段,这里展示不作细分。这些阶段(例如并发标记,并发清除等)与程序线程一起并发运行,此时不会暂停程序线程。但是某些阶段(例如初始标记,清除等)会暂停整个应用程序,所以此图标描述的仅暂停阶段所花费的时间。

在这里插入图片描述
第五部分表示的是GC回收掉的垃圾对象的内存大小。从图中可以看出,Full GC仅仅回收不到1M的对象,而Young GC则回收的对象比较多,大部分发生在12.40左右。

在这里插入图片描述
第六部分表示的是Young Gen,年轻代的内存分配情况。对象都是朝生夕死,年轻代存放的就是刚刚产生的对象,每进行一次GC,都会GC掉很多垃圾对象,剩下的就是右GC Root关联的对象,这些对象会年龄会逐渐增加,达到了一定阈值就会晋升为老年代的对象。可以看到before GC表示的图线随着时间的进行逐渐增大,也就是年轻代中对象越来越多,而GC事件发生后,年轻代中对象就会减少,也就是after GC图线表示的内存变化趋势。

在这里插入图片描述
第七部分是Old Gen,表示的是老年代的内存分配情况。细心的读者会发现,为啥一开始before GC的内存大小比after GC的内存分配要少呢?这里得先知道老年代存放的都是年龄大的对象,意思就是经过了多次GC都没有被GC掉的对象,就会晋升为老年代的对象。所以这就解释了为啥after GC内存要比before GC内存要大,因为每次GC过后,都会有年轻代的对象晋升为老年代对象。

在这里插入图片描述
第八部分是Meta Space,表示的是元数据区内存分配情况。

在这里插入图片描述
第九部分表示的是堆内存分配和晋升情况,从图中可以看出,随着时间的推移,堆区中对象分配越来越多,同事晋升对象也越来越多。

GC Statistics

在这里插入图片描述
左图:表示的是堆内存中Minor GC和Full GC回收垃圾对象的内存。
中图:总计GC时间,包括Minor GC和Full GC,时间单位为ms。
右图:GC平均时间,包括了Minor GC和Full GC。

在这里插入图片描述
接下来则分别表示的是总GC统计,MinorGC的统计,FullGC的统计,GC暂停程序的统计。

Object Stats

在这里插入图片描述
接下来是对象统计,Total Created Bytes表示的是创建的字节总数,Total promoted bytes表示的是晋升的字节总数,Avg creation rate表示的是平均创建字节率,Avg promotion rate表示平均的晋升率。

Memory Leak

由于记录的程序没有内存泄漏,所以这里就没有内存泄漏的日志信息。此处可以诊断8种OOM中的5种(Java堆内存溢出,超出GC开销限制,请求数组大小超过JVM限制,Permgen空间,元空间)。

GC Causes

在这里插入图片描述
CG所花费的时间,也就是停顿线程的时间。

除了上面介绍的以外,还有Consecutive Full GC、Safe Point Duration、Tenuring Summary以及COmmand Line Flags等等,有兴趣的读者可以自己深入学习下。

### 高斯过程回归概述 高斯过程回归(Gaussian Process Regression, GPR)是一种非参数化的贝叶斯方法,广泛应用于时间序列预测、函数逼近和不确定性估计[^2]。作为一种基于高斯过程理论的方法,GPR特别适合处理具有不确定性的数据,并能提供概率分布形式的结果。 #### 基本概念 高斯过程可以被理解为随机变量的集合,其中任意有限数量的这些随机变量都服从联合正态分布[^1]。具体来说,如果 \( \{f(x), x\in X\} \) 是一个高斯过程,则对于任何有限子集 \( (x_1,...,x_n)\subset X \),向量 \( f=(f(x_1),...,f(x_n))^\top \) 应该遵循多元正态分布: \[ p(f|x)=N(\mu,\Sigma) \] 这里 \( N() \) 表示多维正态分布;\( μ \) 和 \( Σ \) 分别代表均值向量与协方差矩阵。而协方差矩阵中的元素由核函数计算得出,即 \( K_{ij}=k(x_i,x_j) \)[^3]。 #### 实现流程 为了实现高斯过程回归模型,通常会经历以下几个阶段: - **定义先验分布**:设定合适的参来构建初始假设空间; - **选择合适核函数**:根据问题特性挑选恰当类型的核函数作为相似度衡量标准; - **训练样本拟合**:利用已知输入输出对更新后验分布; - **测试新实例推断**:通过最大化似然或者最小化误差准则得到最优解并给出置信区间。 下面是一段简单的Python代码演示如何使用`scikit-learn`库来进行基本的高斯过程回归操作: ```python from sklearn.gaussian_process import GaussianProcessRegressor from sklearn.gaussian_process.kernels import RBF, ConstantKernel as C # 定义RBF核函数及其对应的长度尺度参数l=0.1 kernel = C(1.0, (1e-3, 1e3)) * RBF(length_scale=0.1) gp = GaussianProcessRegressor(kernel=kernel, n_restarts_optimizer=10) X_train = [[-1], [0], [1]] # 训练特征 y_train = [-2, 0, 2] # 对应的目标值 gp.fit(X_train, y_train) # 拟合模型 X_test = [[-0.8], [0.8]] # 测试特征 mean_prediction, std_prediction = gp.predict(X_test, return_std=True) print(mean_prediction) # 输出预测均值 print(std_prediction) # 输出预测标准偏差 ``` 此段代码展示了怎样创建一个带有径向基函数(RBF)核的高斯过程对象,并对其进行训练以适应给定的数据点。之后再用这个经过训练后的模型去预测新的未知位置处可能存在的目标数值及其相应的不确定性水平。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值