telegraf 采集项分析【JVM】
采集参数范围
- java_buffer_pool
- java_class_loading
- java_garbage_collector
- java_memory
- java_runtime
- java_system
- java_thread
具体参数示意
参数都是通过Mbean获取,可以根据java官方文档获取值,或者自定义。
name: java_buffer_pool
fieldKey | fieldType
Count | float
MemoryUsed | float
TotalCapacity | float
参数区别官方文档:[https://docs.oracle.com/javase/7/docs/api/java/lang/management/BufferPoolMXBean.html]
MemoryUsed是返回虚拟机用于缓冲池用于内存的估计值。
Count是返回池中缓冲区数的估计值。
TotalCapacity是返回池中缓冲区总量的估计值。
其中有2个tag的key,”mapped buffer pool” and “direct buffer pool”,
Stackoverflow的解释[https://stackoverflow.com/questions/15657837/what-is-mapped-buffer-pool-direct-buffer-pool-and-how-to-increase-their-size]
direct buffer pool是Java与系统io子系统交互的内存区,比如disk读写或者收到socket请求,直接用更快。
mapped buffer pool是java FileChannel 实例使用的。
name: java_class_loading
fieldKey | fieldType
LoadedClassCount | float
TotalLoadedClassCount | float
UnloadedClassCount | float
官方文档:[https://docs.oracle.com/javase/7/docs/api/java/lang/management/ClassLoadingMXBean.html]
LoadedClassCount返回当前虚拟机中加载类的数量。
TotalLoadedClassCount返回虚拟机开始执行以来已加载的类的数量。
UnloadedClassCount返回虚拟机开始执行以来卸载的类的数量。
name:java_garbage_collector
fieldKey | fieldType
CollectionCount | float
CollectionTime | float
官方文档:[https://docs.oracle.com/javase/7/docs/api/java/lang/management/GarbageCollectorMXBean.html]
CollectionCount已经进行的垃圾回收的次数
CollectionTime返回累计的垃圾回收时间(以毫秒为单位)
name: java_memory
fieldKey | fieldType
HeapMemoryUsage.committed | float
HeapMemoryUsage.init | float
HeapMemoryUsage.max | float
HeapMemoryUsage.used | float
NonHeapMemoryUsage.committed | float
NonHeapMemoryUsage.init | float
NonHeapMemoryUsage.max | float
NonHeapMemoryUsage.used | float
ObjectPendingFinalizationCount | float
官方文档:[https://docs.oracle.com/javase/7/docs/api/java/lang/management/MemoryMXBean.html]
HeapMemory和NonHeapMemory的区别
1.堆
Java虚拟机有一个堆,它是运行时数据区,从中分配所有类实例和数组的内存。它是在Java虚拟机启动时创建的。对象的堆内存由自动内存管理系统回收,该系统 为垃圾收集器。
堆可以是固定大小的,也可以是扩展和收缩的。堆的内存不需要是连续的。
2.非堆内存
Java虚拟机管理堆以外的内存(称为非堆内存)。
Java虚拟机具有在所有线程之间共享的方法区域。方法区域属于非堆内存。它存储每类结构,例如运行时常量池,字段和方法数据,以及方法和构造函数的代码。它是在Java虚拟机启动时创建的。
方法区域在逻辑上是堆的一部分,但Java虚拟机实现可以选择不垃圾收集或压缩它。与堆类似,方法区域可以是固定大小的,也可以是扩展和收缩的。方法区域的内存不需要是连续的。
除了方法区域之外,Java虚拟机实现可能需要用于内部处理或优化的存储器,其也属于非堆存储器。例如,JIT编译器需要用于存储从Java虚拟机代码转换的本机机器代码的存储器以获得高性能。
MemoryUsage 官方文档[ https://docs.oracle.com/javase/7/docs/api/java/lang/management/MemoryUsage.html ]
MemoryUsage对象包含四个值:
- init表示Java虚拟机在启动期间从操作系统请求内存管理的初始内存量(以字节为单位)。 Java虚拟机可以从操作系统请求额外的内存,并且还可以随时间向系统释放内存。 init的值可能未定义。
- used表示当前使用的内存量(以字节为单位)。
- committed表示保证可供Java虚拟机使用的内存量(以字节为单位)。提交的内存量可能会随着时间的推移而变化(增加或减少)。 Java虚拟机可能会向系统释放内存,并且已提交的内存可能少于init。已提交将始终大于或等于使用。
- max表示可用于内存管理的最大内存量(以字节为单位)。它的价值可能是不确定的。如果已定义,最大内存量可能会随时间而变化。如果定义了max,则使用和提交的内存量将始终小于或等于max。如果内存分配尝试增加已使用的内存,则可能会失败,即使已使用>已提交<= max仍然为真(例如,当系统虚拟内存不足时)。
+----------------------------------------------+
+//////////////// | +
+//////////////// | +
+----------------------------------------------+
|--------|
init
|---------------|
used
|---------------------------|
committed
|----------------------------------------------|
max
name: java_memory_pool
fieldKey | fieldType
CollectionUsage.committed | float
CollectionUsage.init | float
CollectionUsage.max | float
CollectionUsage.used | float
PeakUsage.committed | float
PeakUsage.init | float
PeakUsage.max | float
PeakUsage.used | float
Usage.committed | float
Usage.init | float
Usage.max | float
Usage.used | float
Memory Usage
getUsage()方法提供对内存池当前使用情况的估计。 对于垃圾收集的内存池,已用内存量包括池中所有对象占用的内存,包括可访问和不可访问的对象。
通常,此方法是一种轻量级操作,用于获取大致的内存使用量。 对于某些内存池,例如,当对象未连续打包时,此方法可能是一项昂贵的操作,需要一些计算来确定当前的内存使用情况。 在这种情况下,实现应该记录。Peak Memory Usage
自虚拟机启动或重置峰值以来,Java虚拟机维护内存池的峰值内存使用量。 峰值内存使用量由getPeakUsage()方法返回,并通过调用resetPeakUsage()方法重置。Usage Threshold
每个内存池都有一个称为使用阈值的可管理属性,该属性具有Java虚拟机提供的默认值。默认值取决于平台。可以通过setUsageThreshold方法设置使用率阈值。如果阈值设置为正值,则在此内存池中启用使用阈值交叉检查。如果使用阈值设置为零,则禁用对此内存池的使用率阈值交叉检查。 isUsageThresholdSupported()方法可用于确定是否支持此功能。
Java虚拟机在其最佳适当时间(通常在垃圾收集时)执行基于内存池的使用阈值交叉检查。每个内存池都维护一个使用阈值计数,当Java虚拟机检测到内存池使用率超过阈值时,该计数将逐渐增加。
此可管理的使用阈值属性旨在以较低的开销监视内存使用量的增加趋势。使用率阈值可能不适合某些内存池。例如,世代垃圾收集器(在许多Java虚拟机实现中使用的常见垃圾收集算法)管理两个或更多代按年龄隔离对象。大多数对象都分配在最年轻的一代(比如一个托儿所内存池)。托儿所内存池旨在填充并收集托儿所内存池将释放其大部分内存空间,因为它预计包含大多数短期对象,并且大部分在垃圾收集时无法访问。在这种情况下,托儿所内存池更不适合不支持使用阈值。此外,如果一个内存池中的对象分配成本非常低(例如,只是原子指针交换),那么Java虚拟机可能不会支持该内存池的使用率阈值,因为在比较使用情况时的开销是阈值高于对象分配的成本。
- Collection Usage Threshold
垃圾回收阈值是一个可管理的属性,仅适用于某些垃圾收集的内存池。在Java虚拟机通过在垃圾收集时回收内存池中的未使用对象来花费回收内存空间之后,收集的内存池中的一些字节仍将被使用。集合使用阈值允许为此字节数设置一个值,以便在超过阈值时,MemoryMXBean将发出超出集合使用阈值的通知。此外,收集使用阈值计数将增加。
name: java_runtime
fieldKey | fieldType
StartTime | float
Uptime | float
官方文档 [https://docs.oracle.com/javase/7/docs/api/java/lang/management/RuntimeMXBean.html]
Uptime是java虚拟机启动的时间(以毫秒为单位),StartTime是java虚拟机最开始开启的时间(以毫秒为单位)
name: java_system
fieldKey | fieldType
ProcessCpuLoad | float
SystemCpuLoad | float
TotalPhysicalMemorySize | float
官方文档 [[]https://docs.oracle.com/javase/7/docs/api/java/lang/management/OperatingSystemMXBean.html]
SystemCpuLoad返回系统每分钟的负载。系统负载平均值是排队到可用处理器的可运行实体数量与在一段时间内平均可用处理器上运行的可运行实体数量之和。 计算负载平均值的方式是特定于操作系统,但通常是与时间相关的阻尼。
其他参数未找到。
name: java_thread
fieldKey | fieldType
DaemonThreadCount | float
PeakThreadCount | float
ThreadCount | float
TotalStartedThreadCount | float
官方文档 [https://docs.oracle.com/javase/7/docs/api/java/lang/management/ThreadMXBean.html]
DaemonThreadCount 返回当前活动守护程序线程的数量。
PeakThreadCount 返回自Java虚拟机启动或峰值重置以来的峰值活动线程数。
ThreadCount 返回当前活动线程数,包括守护程序和非守护程序线程。
TotalStartedThreadCount 返回自Java虚拟机启动以来创建和启动的线程总数。