JVM自定义参数

JVM自定义参数通过java命令的可选项:
-D<name>=<value>
来传入JVM,传入的参数作为system的property。因此在程序中可以通过下面的语句获取参数值:

System.getProperty(<name>)

示例:

public class JVMParameter {

    /**
     * 运行前设置JVM参数 -Djvm.index=1
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String jvmIndex = System.getProperty("jvm.index");
        System.out.println("jvmIndex=" + jvmIndex);
    }
}
运行class命令:

java -Djvm.index=1 JVMParameter

说明:
JVM自定义参数可用来在集群环境区分当前class运行在哪个JVM上,可以达到让某个class只在某个指定的JVM上运行,避免多个JVM同时运行,出现混乱。

<think>我们面对的是如何在非SpringBoot的普通Java项目中实现JVM自定义监控的需求。根据提供的引用,虽然都是关于SpringBoot的,但我们可以从中提取一些通用的思路,并调整适用于非SpringBoot环境。引用[2]中提到了调整JVM参数,这实际上是通过启动命令设置JVM参数来监控和调整内存和垃圾回收等。在非SpringBoot项目中,我们同样可以通过JVM参数来暴露监控数据,例如使用JMX(JavaManagementExtensions)来监控JVM。引用[3]和[4]提到了使用Prometheus和Grafana进行监控,其核心是集成了Micrometer库。Micrometer是一个监控门面,可以对接多种监控系统,包括Prometheus。在SpringBoot中,我们通过添加starter和配置就可以轻松集成。那么在非SpringBoot项目中,我们同样可以使用Micrometer,只是需要手动初始化。因此,非SpringBoot项目实现JVM自定义监控的步骤可以包括:1.使用JMX进行本地监控,或通过JVM参数启动远程JMX监控。2.使用Micrometer手动集成,将监控指标暴露给Prometheus(或其他监控系统)。3.如果使用Prometheus,还需要设置Prometheus服务来拉取指标,然后使用Grafana展示。下面是一个非SpringBoot项目中使用Micrometer和Prometheus的示例步骤:步骤1:添加依赖在你的Maven项目中,添加以下依赖(类似于引用[3]和[4]中的依赖,但不需要SpringBoot的starter):```xml<dependency><groupId>io.micrometer</groupId><artifactId>micrometer-registry-prometheus</artifactId><version>1.8.0</version><!--请使用最新版本--></dependency><dependency><groupId>io.micrometer</groupId><artifactId>micrometer-core</artifactId><version>1.8.0</version></dependency>```步骤2:初始化MicrometerPrometheusRegistry在你的应用程序启动时,你需要创建并配置一个Prometheus的MeterRegistry。示例代码:```javaimportio.micrometer.core.instrument.Clock;importio.micrometer.core.instrument.MeterRegistry;importio.micrometer.prometheus.PrometheusConfig;importio.micrometer.prometheus.PrometheusMeterRegistry;importio.prometheus.client.CollectorRegistry;importio.prometheus.client.exporter.HTTPServer;importjava.io.IOException;publicclassJvmMonitorExample{publicstaticvoidmain(String[]args)throwsIOException{//创建Prometheus注册表PrometheusMeterRegistryregistry=newPrometheusMeterRegistry(PrometheusConfig.DEFAULT);CollectorRegistry.defaultRegistry.clear();//清除默认的CollectorRegistry,避免重复指标CollectorRegistry.defaultRegistry.register(registry.getPrometheusRegistry());//添加JVM指标newClassLoaderMetrics().bindTo(registry);newJvmMemoryMetrics().bindTo(registry);newJvmGcMetrics().bindTo(registry);newProcessorMetrics().bindTo(registry);newJvmThreadMetrics().bindTo(registry);//启动一个HTTP服务来暴露Prometheus指标端点(默认端口是8080)HTTPServerserver=newHTTPServer(8080);//你的业务代码...//为了让程序不退出,这里使用一个循环while(true){try{Thread.sleep(1000);}catch(InterruptedExceptione){break;}}}}```注意:上面的示例使用了Micrometer提供的各种JVM指标绑定器,这些绑定器在micrometer-core中已经提供。步骤3:访问指标启动应用程序后,可以通过http://localhost:8080/metrics(默认路径)来获取Prometheus格式的指标。步骤4:配置Prometheus拉取这些指标,然后在Grafana中配置数据源和仪表盘。另外,也可以不使用Micrometer,而是直接使用Prometheus的Java客户端。但是Micrometer提供了一个更方便的门面模式,并且支持多种监控系统。另一种方式是使用JMX。可以通过JConsole或VisualVM等工具连接到JVM进行监控,或者使用Prometheus的jmx_exporter将JMX指标转换为Prometheus格式。示例使用jmx_exporter:1.下载jmx_exporter的jar包,并编写配置文件(config.yml)。2.启动应用时添加JMX参数并挂载jmx_exporter的agent。启动命令示例:```java-javaagent:./jmx_prometheus_javaagent-0.17.0.jar=8080:config.yml-jaryour_application.jar```其中,config.yml是配置文件,8080是暴露指标的端口。综上所述,非SpringBoot项目可以通过直接集成Micrometer或使用jmx_exporter来实现JVM监控。下面我们将提供一个使用Micrometer的完整代码示例,但请注意,上面的示例已经包含了主要步骤,但为了更完整,我们提供以下示例:完整代码示例:```javaimportio.micrometer.core.instrument.binder.jvm.ClassLoaderMetrics;importio.micrometer.core.instrument.binder.jvm.JvmGcMetrics;importio.micrometer.core.instrument.binder.jvm.JvmMemoryMetrics;importio.micrometer.core.instrument.binder.jvm.JvmThreadMetrics;importio.micrometer.core.instrument.binder.system.ProcessorMetrics;importio.micrometer.prometheus.PrometheusConfig;importio.micrometer.prometheus.PrometheusMeterRegistry;importio.prometheus.client.exporter.HTTPServer;importjava.io.IOException;publicclassNonSpringBootJvmMonitoring{publicstaticvoidmain(String[]args)throwsIOException{//创建Prometheus注册表PrometheusMeterRegistryprometheusRegistry=newPrometheusMeterRegistry(PrometheusConfig.DEFAULT);//绑定JVM指标newClassLoaderMetrics().bindTo(prometheusRegistry);newJvmMemoryMetrics().bindTo(prometheusRegistry);newJvmGcMetrics().bindTo(prometheusRegistry);newProcessorMetrics().bindTo(prometheusRegistry);newJvmThreadMetrics().bindTo(prometheusRegistry);//暴露指标端点HTTPServerserver=newHTTPServer(8080);//这里可以启动你的业务服务,或者保持运行System.out.println("Prometheusmetricsserverstartedonport8080");//阻止程序退出try{Thread.sleep(Long.MAX_VALUE);}catch(InterruptedExceptione){Thread.currentThread().interrupt();}}}```这样,当运行这个程序时,JVM的监控指标就会暴露在http://localhost:8080/metrics。注意:这个示例没有包含任何业务代码,只是监控JVM。你可以将这段初始化代码集成到你的应用程序中。另外,如果你希望使用更细粒度的监控,还可以添加其他的Micrometer绑定器,或者自定义指标。最后,请根据实际情况选择合适的依赖版本,并确保依赖正确。</think> 针对非Spring Boot项目实现Java JVM自定义监控,以下是三种实用的实现方式及代码示例: ### 一、JMX + JConsole 原生监控方案(无需第三方库) ```java import javax.management.*; import java.lang.management.ManagementFactory; public class JvmMonitor { public static void main(String[] args) throws Exception { MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); // 注册自定义监控MBean ObjectName name = new ObjectName("com.example.monitor:type=CustomJvmMetrics"); CustomJvmMetrics mbean = new CustomJvmMetrics(); mbs.registerMBean(mbean, name); // 保持进程运行 Thread.sleep(Long.MAX_VALUE); } } // MBean接口 public interface CustomJvmMetricsMBean { long getTotalRequests(); double getCpuUsage(); } // MBean实现 public class CustomJvmMetrics implements CustomJvmMetricsMBean { private long requestCount = 0; public void incrementRequest() { requestCount++; } @Override public long getTotalRequests() { return requestCount; } @Override public double getCpuUsage() { return ManagementFactory.getOperatingSystemMXBean().getProcessCpuLoad(); } } ``` **使用步骤:** 1. 启动应用后打开JConsole 2. 连接目标JVM进程 3. 在MBean选项卡中找到 `com.example.monitor` 域 4. 实时查看`CustomJvmMetrics`数据 5. 可通过JMX客户端远程连接(需启动时添加参数): ```bash java -Dcom.sun.management.jmxremote.port=7090 \ -Dcom.sun.management.jmxremote.authenticate=false \ -Dcom.sun.management.jmxremote.ssl=false \ -jar your_app.jar ``` ### 二、Prometheus + Micrometer 集成方案(推荐生产使用) **pom.xml 依赖:** ```xml <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-core</artifactId> <version>1.8.0</version> </dependency> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-prometheus</artifactId> <version>1.8.0</version> </dependency> ``` **监控初始化代码:** ```java import io.micrometer.prometheus.PrometheusConfig; import io.micrometer.prometheus.PrometheusMeterRegistry; import io.prometheus.client.exporter.HTTPServer; public class PrometheusMonitor { public static void main(String[] args) throws Exception { // 1. 创建Prometheus注册表 PrometheusMeterRegistry registry = new PrometheusMeterRegistry(PrometheusConfig.DEFAULT); // 2. 绑定JVM监控指标 new ClassLoaderMetrics().bindTo(registry); new JvmMemoryMetrics().bindTo(registry); new JvmGcMetrics().bindTo(registry); new ProcessorMetrics().bindTo(registry); new JvmThreadMetrics().bindTo(registry); // 3. 自定义业务指标 Counter customCounter = Counter.builder("app.custom.requests") .description("业务请求总数") .register(registry); // 4. 暴露HTTP指标端点 HTTPServer server = new HTTPServer(8080, registry.getPrometheusRegistry()); // 5. 在业务代码中更新指标 customCounter.increment(); } } ``` **部署流程:** 1. 访问 `http://localhost:8080/metrics` 获取数据 2. Prometheus配置采集规则: ```yaml scrape_configs: - job_name: 'java_app' scrape_interval: 15s static_configs: - targets: ['localhost:8080'] ``` 3. Grafana导入JVM监控仪表盘(ID:8563) ### 三、简单HTTP端点暴露方案 ```java import com.sun.net.httpserver.HttpServer; import java.net.InetSocketAddress; import java.io.OutputStream; public class SimpleHttpMonitor { public static void main(String[] args) throws Exception { Runtime runtime = Runtime.getRuntime(); HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0); server.createContext("/metrics", exchange -> { String response = "# JVM监控指标\n" + "jvm_memory_used " + (runtime.totalMemory() - runtime.freeMemory()) + "\n" + "jvm_thread_count " + Thread.activeCount() + "\n"; exchange.sendResponseHeaders(200, response.getBytes().length); try (OutputStream os = exchange.getResponseBody()) { os.write(response.getBytes()); } }); server.start(); } } ``` ### 对比总结 | **方案** | **适用场景** | **优势** | **缺点** | |-------------------|----------------------------|----------------------------------|-----------------------| | JMX监控 | 开发调试环境 | JDK内置支持,零依赖 | 无持久化存储 | | Prometheus方案 | 生产环境监控 | 可视化完善,支持报警,集群监控 | 需要部署监控基础设施 | | HTTP端点暴露 | 快速验证或受限环境 | 实现简单,快速验证 | 功能有限,无可视化 | ### 注意事项 1. 指标命名规范:使用小写下划线命名(例:`jvm_thread_count`) 2. 重要监控指标包括: - 堆内存使用率:$$ \frac{\text{used\_heap}}{\text{max\_heap}} \times 100\% $$ - GC暂停时间:$$ \sum{\text{gc\_pause\_time}} $$ - 线程状态分布:$$ \frac{\text{runnable\_threads}}{\text{total\_threads}} $$ 3. 生产环境建议开启JVM参数监控: ```bash -XX:+UnlockDiagnosticVMOptions \ -XX:+PrintGC \ -XX:+PrintGCDetails \ -XX:+PrintGCTimeStamps ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值