Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >聊聊skywalking的MemoryProvider

聊聊skywalking的MemoryProvider

原创
作者头像
code4it
修改于 2020-02-27 02:35:13
修改于 2020-02-27 02:35:13
47400
代码可运行
举报
文章被收录于专栏:码匠的流水账码匠的流水账
运行总次数:0
代码可运行

本文主要研究一下skywalking的MemoryProvider

MemoryProvider

skywalking-6.6.0/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/jvm/memory/MemoryProvider.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public enum MemoryProvider {
    INSTANCE;
    private final MemoryMXBean memoryMXBean;MemoryProvider() {
        this.memoryMXBean = ManagementFactory.getMemoryMXBean();
    }public List<Memory> getMemoryMetricList() {
        List<Memory> memoryList = new LinkedList<Memory>();
​
        MemoryUsage heapMemoryUsage = memoryMXBean.getHeapMemoryUsage();
        Memory.Builder heapMemoryBuilder = Memory.newBuilder();
        heapMemoryBuilder.setIsHeap(true);
        heapMemoryBuilder.setInit(heapMemoryUsage.getInit());
        heapMemoryBuilder.setUsed(heapMemoryUsage.getUsed());
        heapMemoryBuilder.setCommitted(heapMemoryUsage.getCommitted());
        heapMemoryBuilder.setMax(heapMemoryUsage.getMax());
        memoryList.add(heapMemoryBuilder.build());
​
        MemoryUsage nonHeapMemoryUsage = memoryMXBean.getNonHeapMemoryUsage();
        Memory.Builder nonHeapMemoryBuilder = Memory.newBuilder();
        nonHeapMemoryBuilder.setIsHeap(false);
        nonHeapMemoryBuilder.setInit(nonHeapMemoryUsage.getInit());
        nonHeapMemoryBuilder.setUsed(nonHeapMemoryUsage.getUsed());
        nonHeapMemoryBuilder.setCommitted(nonHeapMemoryUsage.getCommitted());
        nonHeapMemoryBuilder.setMax(nonHeapMemoryUsage.getMax());
        memoryList.add(nonHeapMemoryBuilder.build());return memoryList;
    }}
  • MemoryProvider通过ManagementFactory.getMemoryMXBean()获取MemoryMXBean,之后获取了heapMemoryUsage以及nonHeapMemoryUsage指标(init、used、committed、max)

MemoryPoolProvider

skywalking-6.6.0/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/jvm/memorypool/MemoryPoolProvider.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public enum MemoryPoolProvider {
    INSTANCE;private MemoryPoolMetricsAccessor metricAccessor;
    private List<MemoryPoolMXBean> beans;MemoryPoolProvider() {
        beans = ManagementFactory.getMemoryPoolMXBeans();
        for (MemoryPoolMXBean bean : beans) {
            String name = bean.getName();
            MemoryPoolMetricsAccessor accessor = findByBeanName(name);
            if (accessor != null) {
                metricAccessor = accessor;
                break;
            }
        }
        if (metricAccessor == null) {
            metricAccessor = new UnknownMemoryPool();
        }
    }public List<MemoryPool> getMemoryPoolMetricsList() {
        return metricAccessor.getMemoryPoolMetricsList();
    }private MemoryPoolMetricsAccessor findByBeanName(String name) {
        if (name.indexOf("PS") > -1) {
            //Parallel (Old) collector ( -XX:+UseParallelOldGC )
            return new ParallelCollectorModule(beans);
        } else if (name.indexOf("CMS") > -1) {
            // CMS collector ( -XX:+UseConcMarkSweepGC )
            return new CMSCollectorModule(beans);
        } else if (name.indexOf("G1") > -1) {
            // G1 collector ( -XX:+UseG1GC )
            return new G1CollectorModule(beans);
        } else if (name.equals("Survivor Space")) {
            // Serial collector ( -XX:+UseSerialGC )
            return new SerialCollectorModule(beans);
        } else {
            // Unknown
            return null;
        }
    }
}
  • MemoryPoolProvider通过ManagementFactory.getMemoryPoolMXBeans()获取MemoryPoolMXBean列表,之后遍历该列表获取对应的MemoryPoolMetricsAccessor,若找不到则默认为UnknownMemoryPool(表示不支持的垃圾收集器类型);其getMemoryPoolMetricsList则通过metricAccessor.getMemoryPoolMetricsList()返回MemoryPool指标

MemoryPoolMetricsAccessor

skywalking-6.6.0/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/jvm/memorypool/MemoryPoolModule.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public abstract class MemoryPoolModule implements MemoryPoolMetricsAccessor {
    private List<MemoryPoolMXBean> beans;public MemoryPoolModule(List<MemoryPoolMXBean> beans) {
        this.beans = beans;
    }
​
    @Override
    public List<MemoryPool> getMemoryPoolMetricsList() {
        List<MemoryPool> poolList = new LinkedList<MemoryPool>();
        for (MemoryPoolMXBean bean : beans) {
            String name = bean.getName();
            PoolType type;
            if (contains(getCodeCacheNames(), name)) {
                type = PoolType.CODE_CACHE_USAGE;
            } else if (contains(getEdenNames(), name)) {
                type = PoolType.NEWGEN_USAGE;
            } else if (contains(getOldNames(), name)) {
                type = PoolType.OLDGEN_USAGE;
            } else if (contains(getSurvivorNames(), name)) {
                type = PoolType.SURVIVOR_USAGE;
            } else if (contains(getMetaspaceNames(), name)) {
                type = PoolType.METASPACE_USAGE;
            } else if (contains(getPermNames(), name)) {
                type = PoolType.PERMGEN_USAGE;
            } else {
                continue;
            }
​
            MemoryUsage usage = bean.getUsage();
            poolList.add(MemoryPool.newBuilder().setType(type)
                .setInit(usage.getInit())
                .setMax(usage.getMax())
                .setCommited(usage.getCommitted())
                .setUsed(usage.getUsed())
                .build());
        }
        return poolList;
    }private boolean contains(String[] possibleNames, String name) {
        for (String possibleName : possibleNames) {
            if (name.equals(possibleName)) {
                return true;
            }
        }
        return false;
    }protected abstract String[] getPermNames();protected abstract String[] getCodeCacheNames();protected abstract String[] getEdenNames();protected abstract String[] getOldNames();protected abstract String[] getSurvivorNames();protected abstract String[] getMetaspaceNames();
}
  • MemoryPoolModule声明实现了MemoryPoolMetricsAccessor接口,其getMemoryPoolMetricsList遍历MemoryPoolMXBean列表,找出对应的type(CODE_CACHE_USAGE、NEWGEN_USAGE、OLDGEN_USAGE、SURVIVOR_USAGE、METASPACE_USAGE、PERMGEN_USAGE),然后构建对应的MemoryPool指标(type、init、max、committed、used);由于不同垃圾收集器的对应的name不一样,因而这里通过抽象方法暴露给子类去实现,其子类有SerialCollectorModule、ParallelCollectorModule、CMSCollectorModule、G1CollectorModule

小结

MemoryProvider通过ManagementFactory.getMemoryMXBean()获取MemoryMXBean,之后获取了heapMemoryUsage以及nonHeapMemoryUsage指标(init、used、committed、max);MemoryPoolProvider通过ManagementFactory.getMemoryPoolMXBeans()获取MemoryPoolMXBean列表,之后遍历该列表获取对应的MemoryPoolMetricsAccessor,若找不到则默认为UnknownMemoryPool;其getMemoryPoolMetricsList则通过metricAccessor.getMemoryPoolMetricsList()返回MemoryPool指标

doc

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Impala metrics详解之Jvm篇
Impala的web页面提供了非常丰富的信息,其中就包括各种metrics信息。这些metrics非常多,但是官方也没有专门文档解释,所以有时候也看不明白是什么意思。笔者在早期的文章 Impala metrics参数介绍(一)介绍了一些关于admission controller相关的metrics。时隔两年多,今天将跟大家一起来学习下Jvm相关的metrics信息。
skyyws
2022/05/20
9820
Impala metrics详解之Jvm篇
聊聊skywalking的jvm-receiver-plugin
skywalking-6.6.0/oap-server/server-receiver-plugin/skywalking-jvm-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/jvm/provider/JVMModuleProvider.java
code4it
2020/03/21
9090
聊聊skywalking的jvm-receiver-plugin
基于JavaAgent的全链路监控四《JVM内存与GC信息》
案例简述 除了监控java方法的执行耗时,我们还需要获取应用实例的jvm内存与gc信息,以实时把控我们的服务器性能是否在安全范围。监控jvm内存与gc信息是非常重要的,尤其是在大促以及微博火热爆点的时候,我们需要根据监控信息进行扩容,以保证系统稳定。
小傅哥
2020/07/14
1.2K0
聊聊skywalking的GCProvider
skywalking-6.6.0/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/jvm/gc/GCProvider.java
code4it
2020/02/27
3730
聊聊skywalking的GCProvider
Spring Boot 应用监控: Java获取 CPU,内存, JVM 内部运行状况代码
package com.bytedance.kunlun.system; import com.google.common.collect.Maps; import com.sun.management.OperatingSystemMXBean; import org.springframework.stereotype.Component; import oshi.SystemInfo; import oshi.hardware.CentralProcessor; import java.
一个会写诗的程序员
2021/12/16
6.5K0
聊聊skywalking的CPUProvider
skywalking-6.6.0/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/jvm/cpu/CPUProvider.java
code4it
2020/02/25
6670
聊聊skywalking的CPUProvider
聊聊Elasticsearch的JvmStats
elasticsearch-7.0.1/server/src/main/java/org/elasticsearch/monitor/jvm/JvmStats.java
code4it
2019/05/25
4880
聊聊Elasticsearch的JvmStats
聊聊springboot1.x及2.x的JvmGcMetrics的区别
本文主要研究一下springboot1.x及2.x的JvmGcMetrics的区别
code4it
2018/09/17
1.2K0
使用 JMX 监控和管理 Java 程序
Java Management Extensions(JMX)技术是 Java SE 平台的标准功能,提供了一种简单的、标准的监控和管理资源的方式,对于如何定义一个资源给出了明确的结构和设计模式,主要用于监控和管理 Java 应用程序运行状态、设备和资源信息、Java 虚拟机运行情况等信息。JMX 是可以动态的,所以也可以在资源创建、安装、实现时进行动态监控和管理,JDK 自带的 jconsole 就是使用 JMX 技术实现的监控工具。
未读代码
2021/12/13
1.7K0
使用 JMX 监控和管理 Java 程序
聊聊skywalking的jedis-pulgin
skywalking-6.6.0/apm-sniffer/apm-sdk-plugin/jedis-2.x-plugin/src/main/resources/skywalking-plugin.def
code4it
2020/03/25
8870
使用 java.lang.management 包监控 java 虚拟机
对 java 来说,jvm 的监控是工程应用中十分重要的一环,无论是日常的性能优化还是异常处理都离不开监控数据的分析。 java 的 java.lang.management 包提供了用于监控和管理 java 虚拟机及虚拟机各项指标的接口。
用户3147702
2022/06/27
7120
聊聊skywalking的spring-annotation-plugin
本文主要研究一下skywalking的spring-annotation-plugin
code4it
2020/03/06
1.1K0
聊聊skywalking的spring-annotation-plugin
聊聊skywaking的CommandService
skywalking-6.6.0/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/commands/CommandService.java
code4it
2020/02/29
6610
聊聊skywaking的CommandService
如何自己监控java
java自带的java.lang.management.ManagementFactory 可以看到它提供的一些列方法:
爬蜥
2024/01/26
1130
如何自己监控java
聊聊skywalking的JVMService
skywalking-6.6.0/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/boot/BootService.java
code4it
2020/02/24
9280
聊聊skywalking的JVMService
聊聊skywalking的AbstractClassEnhancePluginDefine
本文主要研究一下skywalking的AbstractClassEnhancePluginDefine
code4it
2020/03/03
5610
聊聊skywalking的AbstractClassEnhancePluginDefine
聊聊skywalking的ServiceAndEndpointRegisterClient
本文主要研究一下skywalking的ServiceAndEndpointRegisterClient
code4it
2020/03/01
1.5K0
聊聊skywalking的ServiceAndEndpointRegisterClient
聊聊skywalking的SamplingService
skywalking-6.6.0/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/sampling/SamplingService.java
code4it
2020/02/28
9030
聊聊skywalking的SamplingService
sigar获取机器部分负载信息方法及问题解决
org.hyperic.sigar.SigarException: no libsigar-aarch64-linux.so in java.libra
刘大猫
2024/11/15
1000
聊聊skywalking的TraceSegmentServiceClient
本文主要研究一下skywalking的TraceSegmentServiceClient
code4it
2020/03/02
1.3K0
聊聊skywalking的TraceSegmentServiceClient
推荐阅读
相关推荐
Impala metrics详解之Jvm篇
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验