精华内容
下载资源
问答
  • 不需要安装插件,只要jmeter的运行环境配置好就可以了: 打开这个小工具的步骤很简单,如果你已经配置...出一个【java监视和管理控制台】 jconsole 选择你要查看的进程 我在idea运行几个启动了几个线程 ...

    不需要安装插件,只要jmeter的运行环境配置好就可以了:
    打开这个小工具的步骤很简单,如果你已经配置好了Jmeter运行的环境,那么你也就不用去做其他的配
    置,直接 点击:开始——》运行——》输入cmd——》然后在出现的命令行界面输入“jconsole”即可弹

    出一个【java监视和管理控制台】

    jconsole

    选择你要查看的进程

    我在idea运行几个启动了几个线程

     

     

    展开全文
  • 杂货店 使用Java监视和管理网上商店的程序。 使用Java UI-awtswing。 用artsiom编码。
  • java监视和管理控制台

    2018-09-05 14:25:53
    1.查找jdk路径 /usr/libexec/java_home -V 我的是: 2、进入  cd /Library/Java/JavaVirtualMachines/jdk-10.0.1.jdk/Contents/Home/bin 启动,输入  jconsole

    1.查找jdk路径

    /usr/libexec/java_home -V

    我的是:

    2、进入

           cd /Library/Java/JavaVirtualMachines/jdk-10.0.1.jdk/Contents/Home/bin

    启动,输入

           jconsole

    展开全文
  • 想验证你对 jvm 配的一些调优参数有没有起作用吗?想不想实时监控你自定义的线程池的在实际运行时的...如何根据应用实时的运行运行情况合理配置年轻代(Young Generation,即 Eden 区两个 Survivor 区之)年老代(Ol

    1. 前言

    • 想验证你对 jvm 配的一些调优参数(比如 Xms、Xmx 等)有没有起作用吗?
    • 想不想实时监控你自定义的线程池的在实际运行时的线程个数、有没有死锁?
    • 应用出现 java.lang.OutOfMemoryError: Java heap space,你知道需要去调整 Xms、Xmx。想不想实时监控你的 Java 应用的堆内存使用情况,并根据峰值等数据设置最适合你的 Xms、Xmx 等参数?
    • 应用出现 java.lang.OutOfMemoryError: PermGen space,你知道需要去调整 XX:PermSize、XX:MaxPermSize。想不想找到你的应用的永久区 PermGen 的使用峰值,并根据其去设置合理的 XX:PermSize、XX:MaxPermSize 等参数?
    • 我们都知道,JVM 堆内存划分为年轻代和年老代。JVM 默认下的年老代与年轻代的比例(即 XX:NewRatio,这个名字容易让人产生混淆,即认为是年轻代比年老代)为 2(即把 JVM 堆内存平均分成了三份,年老大占用了两份,而年轻代占用一份。参考资料 Sun Java System Application Server Enterprise Edition 8.2 Performance Tuning Guide),这个比例并不适合所有情况,特别是当你的应用里局部变量远远大于全局变量,而且大量局部变量生命周期都很短的时候。如何根据应用实时的运行运行情况合理配置年轻代(Young Generation,即 Eden 区和两个 Survivor 区之和)和年老代(Old Generation,即 Tenured 区)的比例 XX:NewRatio 值?

    Java 自带性能监控工具:监视和管理控制台 jconsole,它可以提供 Java 某个进程的内存、线程、类加载、jvm 概要以及 MBean 等的实时信息,也许能够对以上问题提供参考。


    2. JVM 一些参数

    在启动 jconsole 之前我们先来回顾一下 JVM 的一些主要参数:
    • -Xms 初始/最小堆内存大小
    • -Xmx 最大堆内存大小
    • -Xmn 年轻代大小
    • -XX:NewSize 年轻代大小
    • -XX:MaxNewSize 年轻代最大值
    • -XX:NewRatio 年老代与年轻代比值
    • -XX:MaxPermSize 持久代最大值
    • -XX:PermSize 持久代初始值
    有些资料说,Xms、Xmx 设置的是 JVM 内存大小,是不对的,JVM 除了留给开发人员使用的堆内存之外还有非堆内存。

    读者可能发现,有三种方式可以划分年轻代大小:-Xmn 方式、-XX:NewSize + -XX:MaxNewSize 方式、-XX:NewRatio 方式。三种都可以,优先级从高到低依次是 -XX:NewSize + -XX:MaxNewSize 方式、-Xmn 方式、-XX:NewRatio 方式,也就是说配置了前面优先级高的后面的优先级低的就被覆盖掉了。


    3. 本机启用 jconsole 以监控 Java 进程

    CMD 切换到 %JAVA_HOME%/bin 目录,直接执行 jconsole
    CMD 切换到 JAVA_HOME bin 目录,直接执行 jconsole

    即可打开 Java 监视和管理控制台:
    即可打开 Java 监视和管理控制台

    本地进程列表里显示了所有本地执行中的 Java 进程,双击你感兴趣的那个进程(比如 PID 为 8504 那个),即可对该进程进行监控了:
    双击你感兴趣的那个进程


    4. 远程监控 Java 进程

    要对 Java 进程进行远程监控,在启动它的时候需要启用 JMX。
    以远程主机上的 tomcat 为例,先为 jmx 找一个可用的远程端口,比如 9999:
    先为 jmx 找一个可用的远程端口

    No news is good news~在 %TOMCAT_HOME%/bin/catalina.sh 文件的前面加上以下配置:
    JAVA_OPTS="-Xms1024m -Xmx2048m -XX:MaxPermSize=128m -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"


    如图
    tomcat的JAVA_OPTS配置

    【博主 20150526 加注:开始】这样写在 tomcat 关闭的时候(执行 %tomcat%/bin/shutdown.sh)会报端口已使用异常:

    错误: 代理抛出异常错误: java.rmi.server.ExportException: Port already in use: 9999; nested exception is: 
            java.net.BindException: 地址已在使用

    这是因为 tomcat 在启动、停止的时候都会执行 JAVA_OPTS 配置。这样就只能使用 kill -9 来关闭 tomcat 了...

    解决办法是把监控配置写在 CATALINA_OPTS 里:

    JAVA_OPTS="-Xms1024m -Xmx2048m -XX:MaxPermSize=128m"
    CATALINA_OPTS="-Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"

    就可以了。CATALINA_OPTS 配置只是在 tomcat 启动的时候执行。参考资料:https://bowerstudios.com/node/636【博主 20150526 加注:结束】

    然后重启 tomcat,在本机打开 Java 监视和管理控制台,"远程进程" 输入远程主机名和 jmx 端口号:

    jmx 远程连接

    点击 "连接" 按钮,即可对远程主机上的 tomcat 进行实时监控了:
    即可对远程主机上的 tomcat 进行实时监控了


    5. jconsole 提供的一些有用信息

    接着第 4 步的案例往下看。

    5.1. JVM 设定信息是否起作用检查

    点击 "VM 概要" 可以查看到刚才我们设定的 JAVA_OPTS 的一些参数已经奏效了:
    JAVA_OPTS 的一些参数已经奏效

    5.2. tomcat 线程池、自定义线程池数量情况实时监控

    还在为 tomcat 线程池的神秘面纱而头疼?还在为自己定义的线程池 "黑盒" 一般而苦恼?看看下图:
    tomcat线程情况

    我们的 tomcat 刚启动,从上图可以看出只有一个 http-8080-Acceptor-0 线程,我们去访问一下我们的项目,然后再回来看看:
    http-8080 线程一下子增长到了 8 个

    http-8080 线程一下子增长到了 8 个。是不是一切一目了然,尽在掌握之中?

    5.3. 内存使用实际消耗

    点击 Java 监视和管理控制台 "内存" 叶项,可以看到 tomcat 堆内存的使用情况:
    tomcat 堆内存的使用情况

    图表里有很多选项:
    图表里有很多选项

    我们看一下 Eden 区:
    Eden区

    Eden 区基本和整个堆内存的走势差不多。再看 Survivor 区:
    Survivor区

    Survivor 区在较短时间内的走势相对平稳。再看 Old Gen 区:
    再看 Old Gen 区

    这个走势更加平稳,而且对比 Survivor 区、Old Gen 区两张图,可以很明显地看出,在大约 19:58 那个时刻有将一批对象从 Survivor 区移到 Old Gen 区。最后看 Perm Gen 区。
    这个走势最平稳了。可以明显看出,在大约 19:58,在我们访问一下我们的项目的时候,一些新的 class 等静态资源加载到了 JVM 中。5.4 的加载类数的图也证实了这一点。

    5.4. tomcat 加载类的情况

    tomcat 加载类的情况


    6. 配合 jmap 的使用

    先找到我们 tomcat 进程的 PID 是 13863

    先找到我们 tomcat 进程的 PID 是 13863,然后执行 jmap -heap 13863:
    jmap -heap 13863

    Heap Configuration 里列的基本就是我们刚才配的那些,比如 MaxHeapSize 是 2048 MB,MaxPermSize 是 128 MB。这个和 5.1 里的是一样的。


    参考资料

    展开全文
  • JConsole(Java Monitoring and Management Console)是一种基于JMX的可视化监视管理工具。他管理部分的功能是针对JMX MBean进行管理,由于MBean可以使用代码、中间件服务器的管理控制台或者所有符合JMX规范的软件...

            JConsole(Java Monitoring and Management Console)是一种基于JMX的可视化监视、管理工具。他管理部分的功能是针对JMX MBean进行管理,由于MBean可以使用代码、中间件服务器的管理控制台或者所有符合JMX规范的软件进行访问,这里着重介绍JConsole监控部分的功能。

    启动JConsole

            通过JDK/bin目录下的“jconsole.exe”启动JConsole后,将自动搜索出本机运行的所有虚拟机进程,不需要用户自己再使用jps来查询了,如下图所示。双击选择其中一个进程即可开始监听,也可以使用下面的“远程进程”功能来连接远程服务器,对远程虚拟机进行监控。

            从上图可以看出,该机器现在运行了Eclipse、JConsole和MonitoringTest三个本地虚拟机进程,其中MonitoringTest就是准备的“反面教材”代码之一。双击他进入JConsole主界面,可以看到主界面里共包括“概述”、“内存”、“线程”、“类”、“VM摘要”、“MBean”6个页签,如下图所示。

            “概述”页签显示的是整个虚拟机运行数据的概览,其中包括“堆内存使用情况”、“线程”、“类”、“CPU使用情况”4种信息的曲线图,这些曲线图是后面“内存”、“线程”、“类”页签的信息汇总,具体内容将在后面介绍。

    内存监控

            “内存”页面相当于可视化的jstat命令,用于监视受收集器管理的虚拟机内存(Java堆和永久代)的变化趋势。我们通过运行下面代码来体验一下他的监视功能。运行时设置的虚拟机参数为:-Xms100m-XX :  +UseSerialGC,这段代码的作用是以64KB/50毫秒的速度往Java堆中填充数据,一共填充1000次,使用JConsole的“内存”页签进行监视,观察曲线和柱状图指示图的变化。

    /**
     * 内存占位符对象,一个OOMObject大约占64K
     */
    static class OOMObject {
        public byte[] placeholder = new byte[64 * 1024];
    }

    public static void fillHeap(int num) throws InterruptedException {
        List<OOMObject> list = new ArrayList<OOMObject>();
        for (int i = 0; i < num; i++) {
            // 稍作延时,令监视曲线的变化更加明显
            Thread.sleep(50);
            list.add(new OOMObject());
        }
        System.gc();
    }

    public static void main(String[] args) throws Exception {
        fillHeap(1000);
    }

            程序运行后,在“内存”页签中可以看到内存池Eden区的运行趋势呈现折线状,如下图所示。而监视范围扩大至整个堆后,会发现曲线是一条向上增长的平滑曲线。并且从柱状图可以看出,在1000次循环执行结束,运行了System.gc()后,虽然整个新生代Eden和Survivor区都基本被清空了,但是代表老年代的柱状图仍然保持峰值状态,说明被填充进堆中的数据在System.gc()方法执行之后仍然存活。现提两个小问题供思考。

    • 虚拟机启动参数只限制了Java堆为100MB,没有指定-Xmn参数,能否从监控图中估计出新生代有多大?

    下图显示Eden空间为27 328KB,因为没有设置-XX : SurvivorRadio参数,所以Eden与Survivor空间比例为默认值8:1,整个新生代空间大约为27 328KB*125%=34 160KB。

    • 为何执行了System.gc()之后,下图中代表老年代的柱状图仍然显示峰值状态,代码需要如何调整才能让System.gc()回收掉填充到堆中的对象?

    执行完System.gc()之后,空间未能回收是因为List<OOMObject> list对象仍然存活,fillHeap()方法仍然没有退出,因此list对象在System.gc()执行时仍然处于作用域之内。如果把System.gc()移动到fillHeap()方法外调用就可以回收掉全部内存。

    线程监控

            如果上面的“内存”页签相当于可视化的jstat命令的话,“线程”页签的功能相当于可视化的jstack命令,遇到线程停顿时可以使用这个页签进行监控分析。线程长时间停顿的主要原因主要有:等待外部资源(数据库连接、网络资源、设备资源等)、死循环、锁等待(活锁和死锁)。同构下面代码分别演示一下这几种情况。

    /**
     * 线程死循环演示
     */
    public static void createBusyThread() {
    Thread thread = new Thread(new Runnable() {
        @Override
        public void run() {
            while (true)   // 第41行
                ;
        }
    }, "testBusyThread");
    thread.start();
    }

    /**
     * 线程锁等待演示
     */
    public static void createLockThread(final Object lock) {
    Thread thread = new Thread(new Runnable() {
        @Override
        public void run() {
            synchronized (lock) {
                try {
                    lock.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }, "testLockThread");
    thread.start();
    }

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        br.readLine();
        createBusyThread();
        br.readLine();
        Object obj = new Object();
        createLockThread(obj);
    }

            程序运行后,首先在“线程”页签中选择main线程,如下图所示。堆栈追踪显示BufferedReader在readBytes方法中等待System.in的键盘输入,这时线程为Runnable状态,Runnable状态的线程会被分配运行时间,但readBytes方法检查到流没有更新时会立刻归还执行令牌,这种等待只消耗很小的CPU资源。

            接着监控testBusyThread线程,如下图所示,testBusyThread线程一直在执行空循环,从堆栈追踪中看到一直在MonitoringTest.java代码的41行停留,41行为:while(true)。这时候线程为Runnable状态,而且没有归还线程执行令牌的动作,会在空循环上用尽全部执行时间直到线程切换,这种等待会消耗较多的CPU资源。

             下图显示testLockThread线程在等待着lock对象的notify或notifyAll方法的出现,线程这时候处于WAITING状态,在被唤醒前不会被分配执行时间。

            testLockThread线程正在处于正常的活锁等待,只要lock对象的notify()或notifyAll()方法被调用,这个线程便能激活以继续执行。下面代码演示了一个无法再被激活的死锁等待。

    /**
     * 线程死锁等待演示
     */
    static class SynAddRunalbe implements Runnable {
        int a, b;
        public SynAddRunalbe(int a, int b) {
            this.a = a;
            this.b = b;
        }

        @Override
        public void run() {
            synchronized (Integer.valueOf(a)) {
                synchronized (Integer.valueOf(b)) {
                    System.out.println(a + b);
                }
            }
        }
    }

    public static void main(String[] args) {
        for (int i = 0; i < 100; i++) {
            new Thread(new SynAddRunalbe(1, 2)).start();
            new Thread(new SynAddRunalbe(2, 1)).start();
        }
    }

            这段代码开了200个线程去分别计算1+2以及2+1的值,其中for循环是可省略的,两个线程也可能会导致死锁,不过那样概率太小,需要尝试运行很多次才能看到效果。一般的话,带for循环的版本最多运行2~3次就会遇到线程死锁,程序无法结束。造成死锁的原因是Integer.valueOf()方法基于减少对象创建次数和节省内存的考虑,[-128, 127]之间的数字会被缓存,当valueOf()方法传入参数在这个范围之内,将直接返回缓存中的对象。也就是说,代码中调用了200次Integer.value()方法一共就只返回了两个不同的对象。假如在某个线程的两个synchronized块之间发生了一次线程切换,那就会出现线程A等着被线程B持有的Integer.valueOf(1),线程B又等着被线程A持有的Integer.valueOf(2),结果出现大家都跑不下去的情景。

            出现线程死锁之后,点击JConsole线程面板的“检测到死锁”按钮,将出现一个新的“死锁”页签,如下图所示。

             上图中很清晰的显示了线程Thread-43在等待一个被线程Thread-12持有Integer对象,而点击线程Thread-12则显示他也在等待一个Integer对象,被线程Thread-43持有,这样两个线程就互相卡住,都不存在等到锁释放的希望了。

    展开全文
  • 最近遇到了内存溢出问题,详细了解了下。 ... 1. 前言 想验证你对 jvm 配的一些调优参数(比如 Xms、Xmx 等)有没有起作用吗?想不想实时监控你自定义的线程池的在实际运行...应用出现 java.lang.OutOfMemoryError: Jav
  • 知道吗?java提供了监控性能管理的方式,也就是程序员可以利用java中提供的类来监控和管理java程序的性能 然后可以对程序性能优化哦 快来看看吧^_^
  • JConsole(Java Monitoring and Management Console) 1、启动JConsole 通过JDK/bin目录下的“jconsole.exe”启动JConsole,点击本地连接(也可以使用下面的“远程进程”功能来连接远程服务器),选择进程,页面如下...
  • 概述 EasyMX使用REST和Eclipse插件来简化监视和管理Java应用程序的过程。 文献资料 当前,Javalobby文章可用作文档。... 在JavaLobby上发布了一篇文章,解释了EasyMX的管理和监视方式。 你可以在文章
  • ##概述RedHelix是一个Java服务器,用于使用规范监视硬件。 RedHelix服务器使用Redfish规范来监视多个设备。 它建立一个代表设备清单状态的内存数据库,并提供一个Restfull API来查询设备的历史记录。 执照 ...
  • 面向对象基础及java语言课程设计医院药房信息管理系统,医院药房信息管理系统是为更好的管理和维护医院药品信息管理工作而开发的管理系统。该系统可以通过录入、增加、删除、修改、查询、浏览医院药品信息等操作,来...
  • Java和监视

    千次阅读 2018-06-29 10:47:35
    Java中,每个对象Class内部都有一个锁,Class广义上也是一个单例对象,每个对象Class会一个监视器关联,注意措辞,锁是存在于对象内部的数据结构,监视器是一个独立的结构但是对象关联,相同点是对象一定...
  • JConsole( Java Monitoring and Management Console)是一款基于JMX( Java Manage-ment Extensions)的可视化监视管理工具。它的主要功能是通过JMX的MBean( Managed Bean)对系统进行信息收集参数动态调整。 ...
  • Raanan Zion https://au.linkedin.com/pub/raanan-zion/88/7b9/255 ssh用于Unix,Linux和MS Windows系统管理和监视Java接口。 自动执行防火墙规则检查; 将结果导出到Excel。 允许您同时在多个服务器上运行多个...
  • Java - 锁和监视器有什么区别?

    万次阅读 2019-08-19 16:49:31
    要回答这个问题,你必须深入理解Java的多线程底层是如何工作的。 简短的答案是,锁为实现监视器提供必要的支持。详细答案如下。 锁(Lock) 逻辑上锁是对象内存堆中头部的一部分数据。JVM中的每个对象都有一个锁...
  • 使用Java平台管理bean

    2021-02-04 10:48:53
    Java2平台5.0版引入的众多新特性中,有一个API可以让Java应用程序允许的工具监视和管理Java虚拟机(JVM)虚拟机所在的本机操作系统。在本文中,将学习这个新的平台管理API的功能,这个API包含在java.lang....
  • 软件包 java.lang.management提供管理接口,用于监视和管理 Java 虚拟机以及 Java 虚拟机在其上运行的操作系统。 接口摘要ClassLoadingMXBean用于 Java 虚拟机的类加载系统的管理接口。CompilationMXBean用于 Java ...
  • 该应用程序是Java项目的关键监视和管理库,仅需一行代码即可进行设置。 1.1核心初始提交。 1.1 UI初始提交。 系统要求 Spring框架架构 淡褐色+3.7.9 入门 您可以选择如何组装它们。 <groupId>byzas.libs ...
  • 监视和管理 Java 虚拟机

    千次阅读 2016-06-18 23:03:59
    软件包 java.lang.management 提供了管理接口,用于监视和管理 Java 虚拟机以及 Java 虚拟机在其上运行的操作系统。 接口摘要 ClassLoadingMXBean 用于 Java 虚拟机的类加载系统的管理接口。 ...
  • 监控任务管理器中某个进程的使用情况,检测该进程是否正常运行,内存使用量为多少,每分钟检测一次!
  • 本文介绍了使用第一个java虚拟机启动另一个虚拟机,并用第一个虚拟机的java程序去测试另一个虚拟机上java程序运行时的内存,CPU资源占用情况。
  • 监视和管理电脑所有的tcp连接 非常实用,比如解决端口冲突等问题。
  • 该插件基于Oracle提供的强大工具VisualVM和Java Mission Control。 该插件使您可以在Minecraft本身中使用这些工具提供的功能。 这对于无法使用工具的服务器所有者/管理员可能很有用。 此外,它是为《我的世界》...
  • 一个Java脚本模块,封装了IBM Integration Bus管理以及操作监视HTTPMQTT接口。 使用此模块,您可以通过Java脚本对象,函数回调来访问那些功能。 这适用于iib-ops-rest。 该存储库的初始原型以的分支的子集...
  • 公司农业管理系统java源码TheWeatherCompany_SmartThings Smartapp设备可基于通过SmartThings API提供的网络通道服务使事物自动化 在您的IDE中导入Smartapp设备处理程序,然后自己发布2 在移动应用程序中“自动...
  • 关于java实验报告模板 1掌握JavaApplet的程序结构开发...掌握布局管理器的用法 6理解ActionEvent事件的含义 7掌握事件源监视器处理事件的接口这三个概念 二实验内容 1.编写有三个文本框一个按钮的JavaApplet程序要
  • 戴尔服务器电源散热微服务将使管理员能够按机架中的一个节点或一组节点监视和管理电源散热。 微服务可在dockerhub上作为要下载运行的docker映像使用。 如何安装 此服务的Docker容器位于: : -sudo docker ...
  • java学生成绩管理系统界面设计

    万次阅读 多人点赞 2018-06-29 10:35:40
    关于学生成绩管理系统的界面设计:代码如下 1import&nbsp;javax.swing.*; 2import&nbsp;java.awt.*; 3import&nbsp;java.awt.event.*; 4import&nbsp;com.example.SqlHelper; 5class&nbsp;...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 85,355
精华内容 34,142
关键字:

java监视和管理

java 订阅