Решение для монитора размера кучи Java - PullRequest
0 голосов
/ 21 января 2019

Я хотел бы отслеживать размер используемого кучи Java службы jboss, работающей в Windows в течение нескольких дней.Сначала я пытаюсь использовать perfmon из окон, но не получил ожидаемого значения.Я могу подключить jvisualvm к этому сервису, используя jmx (сервер: порт), я также могу использовать jconsole или jmc (управление полетом java).Действительно, я не могу использовать запись полета из-за версии jvm.С jcmd или jstat я не вижу процесса, который меня интересует. Поскольку я новичок в Java, кто-то может предложить приложение или скрипт, который позволил бы мне отловить эти значения и отправить их, например, в текстовый файл.Я мог бы также написать что-нибудь в .Net, если бы библиотека существовала.

Спасибо

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Ниже код Java записывает использование кучи Java (по умолчанию 2 минуты один раз) в текстовый файл.Вы можете изменить код в соответствии с вашими потребностями.Измените private String jmxUrl = ... в соответствии с вашей средой.

package com.heap.monitor;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.lang.management.*;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import javax.management.*;
import javax.management.remote.*;

public class HeapMonitor extends Thread {

private JMXServiceURL jmxService = null;
private JMXConnector jmxConnector = null;
protected MBeanServerConnection beanServerConn = null;
private long frequency = 2 * 60 * 1000L; // 2 mins only collects Heap metrics
private String jmxUrl = "service:jmx:rmi:///jndi/rmi://192.168.8.252:12222/jmxrmi";
private String userName = "none";
private String passWord = "none";

public static void main(String[] args) throws InterruptedException {
    HeapMonitor heapMonitor = new HeapMonitor();
    heapMonitor.join();
}

public HeapMonitor() {
    this.start();
}

public void run() {
    boolean flag = true;
    while(flag) {
        try {
            beanServerConn = connectToJVM(jmxUrl, userName, passWord);
            if(beanServerConn!=null) {
                MemoryMXBean mxbean = (MemoryMXBean) ManagementFactory.newPlatformMXBeanProxy(beanServerConn, ManagementFactory.MEMORY_MXBEAN_NAME, MemoryMXBean.class);
                try
                {
                    MemoryUsage heapUsage = mxbean.getHeapMemoryUsage();
                    long used = heapUsage.getUsed();
                    long max = heapUsage.getMax();
                    long commited = heapUsage.getCommitted();
                    long init = heapUsage.getInit();
                    StringBuffer buffer = new StringBuffer();
                    Date date = new Date();
                    buffer.append(date).append(" - ");
                    buffer.append(init).append("   ").append(commited).append("   ").append(max).append("   ").append(used);
                    //System.out.println(buffer.toString());
                    appendStrToFile("heap.txt" , buffer.toString());
                }
                catch(Exception ee) {
                    ee.printStackTrace();
                }
            }
        }
        catch(Exception e) {
            e.printStackTrace();
        }

        try {
            Thread.sleep(frequency);
        }
        catch(Exception e) {
            e.printStackTrace();
        }
    }
}

protected MBeanServerConnection connectToJVM(String jvmURL, String user, String pass)
{
    beanServerConn = null ;  
    try
    {
        jmxService = new JMXServiceURL(jvmURL);
        Map environment = new HashMap();
        int jmxconnect_timeout = 30000;
        environment.put("jmx.remote.x.request.waiting.timeout", Long.toString(jmxconnect_timeout));


        if(user.equalsIgnoreCase("none")|| (pass.equalsIgnoreCase("none"))){
            try{
                jmxConnector = JMXConnectorFactory.connect(jmxService,environment);
                beanServerConn = jmxConnector.getMBeanServerConnection();
            }
            catch(IOException ioe){
            }
        }
        else
        {
            String [] credentials={user,pass};
            environment.put(JMXConnector.CREDENTIALS, credentials);
            try{
                jmxConnector = JMXConnectorFactory.connect(jmxService,environment);
                beanServerConn = jmxConnector.getMBeanServerConnection();

            }
            catch(IOException ioe){
            }
        }

        beanServerConn = jmxConnector.getMBeanServerConnection();

        if(beanServerConn == null)
        {
            System.out.println("Connection to JVM is not established for jvmURL : " + jvmURL);
            closeJVMConn();
        }
    }
    catch(Exception ex)
    {
        System.out.println("Connection to JVM is not established for jvmURL : " + jvmURL);
        closeJVMConn();
    }
    return beanServerConn;
}

public void closeJVMConn(){
    try{
        beanServerConn = null;
        if(jmxConnector != null)
            jmxConnector.close();
    }
    catch(Exception ex){
        return;
    }
}

 public void appendStrToFile(String fileName, String str) { 
    try { 
        // Open given file in append mode. 
        BufferedWriter out = new BufferedWriter(new FileWriter(fileName, true)); 
        out.write(str); 
        out.newLine();
        out.close(); 
    } 
    catch (IOException e) { 
        System.out.println("exception occoured" + e); 
    } 
 } 
}
0 голосов
/ 22 января 2019

Используя Jconsole, вы можете просматривать и фиксировать использование памяти Heap / Non-Heap (также CPU, Threads и т. Д.).В Jconsole появляются небольшие всплывающие окна, когда Щелкните правой кнопкой мыши график использования памяти кучи , как показано на скриншоте.Вы можете сохранить данные в формате .csv для выбранного временного диапазона.

Jconsole Window

...