监视负载很重的Java应用程序

时间:2018-01-30 22:09:03

标签: java monitoring

我想知道在Java中获取应用程序的性能指标的标准做法是什么。目前,我们定期安排一项收集系统指标的任务。通常,此任务不会按时安排,导致指标在当时不可用,导致监控仪表板被破坏[如果线图会出现间隙]。

通常,当应用程序性能不佳时,我们希望所有指标都可用。但是我们观察到那些是我们无法收集任何指标的时候[因为应用程序非常繁忙]

2 个答案:

答案 0 :(得分:0)

  1. 您可以使用名为top-threads的工具,可在此处找到:https://bitbucket.org/pjtr/topthreads

    这样做可以为您提供有关目标JVM加载的每个类和线程的每个请求详细信息(RAM,CPU等)。

    上面的页面

  2. 提供了这种用法
  3. 您可以使用位于java lib目录的Tools.jar文件中的Sun库将代理加载到目标VM中。

  4. 加载代理如下所示:

    /**
     * Hooks/Attaches to the process's VM with a given PID
     * 
     * @return true if the hook/attach was successful
     */
    public boolean hook() {
        try {
            return (vm = VirtualMachine.attach(Long.toString(pid))) != null;
        } catch (AttachNotSupportedException | IOException e) {
            e.printStackTrace();
            return false;
        }
    }
    
    /**
     * Loads a thread agent which can debug the running threads and classes of this process
     * @param agent - the location of the agent jar file
     * @param options - the options/arguments to pass into the agents main method
     */
    public boolean loadAgent(String agent, String options) {
        try {
            vm.loadAgent(agent, options);
            return true;
        } catch (AgentLoadException | AgentInitializationException | IOException e) {
            e.printStackTrace();
            return false;
        }
    }
    

    Agent Main Class看起来像这样......

    另外,请注意:创建代理jar时,必须在清单文件中指定Agent-main,其中包含要从中加载代理的Class包含agentmain方法的位置。

    public class Agent {
        /**
         * An Object Lock for thread sync's if neccessary */
        public static final Object LOCK = new Object();
    
       /**
        * Starts the agent with this agent main
        * 
        * @param agentArgs
        *            - the agent args being passed into this method
        * @param inst
        *            - the instrumentation instrument that is passed into this
        *            method
        */
        public static void agentmain(String agentArgs, Instrumentation inst) {
              //Do whatever you want to the target VM here, hacky, but eh, use at your own risk, it is included in java itself...
        }
    }
    

    代理清单文件的描述

    Manifest-Version: 1.0
    Agent-Class: packageNameThatWillBeDifferent.Agent
    Created-By: 1.8.0_101 (Oracle Corporation)
    

答案 1 :(得分:0)

无论这是“企业”应用程序还是在JVM中执行其服务的小型服务。您需要深入了解此垃圾收集运行时的基本运行状况详细信息。这是内存池(堆,堆外),GC统计最显着。

从主机视图中收集流程指标(CPU使用率,驻留集大小(RSS),IO)无助于您真正了解JVM的功能,也无法了解代码中的热点。< / p>

如果您无法访问代码,那么代理可能是唯一获得JVM洞察力的机会。否则,您应该使用上面提到的一些着名的Java度量库来检测JVM。

从我的观点来看,最广泛使用的Java度量标准库是Dropwizard Metrics

尽管我有点偏颇,但我建议您查看Micrometer项目。您可以在几行代码中配置一组基本JVM运行时指标,以便基本了解JVM运行时行为。如果这样做,您可以通过计时来开始检测代码中的热点。 千分尺为各种已建立的监控系统提供了大量的公制出口商。 (普罗米修斯,InfluxDb,石墨,...)