虚拟机性能监控与故障处理工具

通过虚拟机实现裸机汇编环境 通过虚拟机实现裸机汇编环境 1. 简述 操作系统带来便利的同时也引入了大量限制,在操作系统存在时,我们编写的程序不能直接被硬件加载。我们必须按照操作系统的约定,把程序编译成特定的可执行文件格式(比如Windows的PE文件格式,Linux的ELF文件格式)。执行程序时,由操作系统读取可执行文件,选择合适的内存空间,并将代码和数据加载到内存中相应位置,这样程序才能被处理器所执行,在程序执行过程中遇到... 阅读详情

虚拟机性能监控与故障处理工具

概述

给一个系统定位问题时,知识、经验是关键基础,数据是依据,工具是运用知识处理数据的手段。这里的数据包括:运行日志、异常堆栈、GC日志、线程快照、堆转储快照等。使用适当的虚拟机监控和分析工具可以加快分析数据、定位解决问题的速度

JDK的命令行工具

在JDK的bin目录中提供了很多命令行工具,这些命令行工具为用户处理应用程序性能问题、定位故障提供了帮助。下面将介绍其中关于监视虚拟机和故障处理的工具。这些JDK工具都非常小,基本都在27KB左右,大多数都是对jdk/lib/tools.jar类库的一层薄包装。之所以选用Java代码实现这些监控工具,是因为当
程序部署到生产环境后,无论是直接接触物理服务器还是远程Telnet到服务器都可能会受到限制。借助tools.jar类库中的接口,可以直接在应用程序中实现功能强大的监控分析工具,由于部分功能基于JMX,因此需要开启JMX管理功能,JDK 1.6之上的虚拟机默认开启。JDK主要命令行监控工具用途如下

名称主要作用
jpsJVM Process Status Tool, 显示指定系统内所有的HotSpot虚拟机进程
jstatJVM Statistics Monitoring Tool,用于收集HotSpot虚拟机各方面的运行数据
jinfoConfiguration Info for Java, 显示虚拟机配置信息
jmapMemory Map for Java,生成虚拟机内存转储快照(heapdump文件)
jhatJVM Heap Dump Browser,用于分析heapdump文件,其会建立一个HTTP/HTML服务器,让用户可以在浏览器上查看分析结果
jstackStack Trace for Java,显示虚拟机的线程快照

jps: 虚拟机进程状况工具

jps可以列出正在运行的虚拟机进程,并显示虚拟机执行主类名称以及这些进程的本地虚拟机唯一ID(Local Virtual Machine Identifier, LVMID)。虽然功能比较单一,但确是使用频率最高的JDK命令行工具,其他JDK工具大多需要输入它查询到的LVMID来确定要监控的是哪一个虚拟机进程。对本地虚拟机进程来说,LVMID与操作系统的进程ID是一致的,使用UNIX的ps命令也可以查询到虚拟机进程的LVMID,但如果同时启动多个虚拟机进程,则无法根据虚拟机进程名称定位,只能依赖jps命令显示主类的功能才能区分

jsp命令格式:

jps [options] [hostid]

jps可以通过RMI协议查询开启RMI服务的远程虚拟机进程状态,hostid为RMI注册表中注册的主机名。jps其他常用选项

选项作用
-q只输出LVMID,省略主类名称
-m输出虚拟机进程启动时传递给主类main()参数的参数
-l输出主类的全名,如果进程执行的是Jar表,输出Jar路径
-v输出虚拟机进程启动时JVM参数

在这里插入图片描述

jstat:虚拟机统计信息监控工具

jstat是用于监控虚拟机各种运行状态信息的命令行工具。可以显示本地或远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据,在没有GUI图形界面,只提供纯文本控制台环境的服务器上,将是运行期定位虚拟机性能问题的首选工具

jstat命令格式:

jstat [option vmid [interval [s|ms] [count]]]

对于命令格式中的VMID与LVMID需要特别说明一下:如果是本地虚拟机进程,VMID与LVMID是一致的,如果是远程虚拟机进程,VMID格式为:[protocol:][//]lvmid[@hostname[:port]/servername]

参数interval和count代表查询间隔和次数,如果省略这两个参数,说明只查询一次。假设每250毫秒查询一次进程2764垃圾收集状态,一共查询20次,命令为:
jstat -gc 2764 250 20

选项option代表用户希望查询的虚拟机信息,主要分为3类:类装载、垃圾收集、运行期编译状况

选项作用
-class监视类装载、卸载数量、总空间以及类装载所耗费的时间
-gc监视Java堆状况,包括Eden区、两个survivor区、老年代、永久代等的容量、已用空间、GC时间合计等信息
-gccapacity监视内容与-gc基本相同,但输出主要关注Java堆各个区域使用到的最大、最小空间
-gcutil监视器内容与-gc基本相同,但输出主要关注已使用空间占总空间的百分比
-gccause与-gcutil功能一样,但是会额外输出导致上一次GC产生的原因
-gcnew监视新生代GC状况
-gcnewcapacity监视内容与-gcnew基本相同,输出主要关注使用到的最大、最小空间
-gcold监控老年代GC状况
-gcoldcapacity监控内容与-gcold基本相同,输出主要关注使用到的最大、最小空间
-gcpermcapacity输出永久代使用的最大、最小空间
-compiler输出JIT编译器编译过的方法、耗时等信息
-printcompilation输出已经被JIT编译的方法

运行jstat -gcutil 18105,结果如下

在这里插入图片描述

查询结果表示:

  • 这台服务器新生代Eden区(E,表示Eden)使用了12.18%的空间

  • 两个Survivor区,分别是s0,没用使用任何空间;s1,使用99.61%的空间

  • 老年代(O,代表old)使用15.28%空间

  • 元空间(M,表示Metaspace)占用98.08%

  • CCS表示压缩类空间,使用96.70%

  • YGC,新生代GC即Minor GC共发生21次

  • YGCT表示21次Minor GC总耗时2.001秒

  • FGC表示Full GC两次

  • FGCT表示两次Full GC总耗时0.084秒

  • GCT表示GC总耗时2.085秒

jinfo: Java配置信息工具

jinfo可以实时查看和调整虚拟机各项参数。使用jps命令的-v参数可以查看虚拟机启动时显式指定的参数列表,但如果想知道未被显式指定的参数的系统默认值,则需要使用jinfo 的-flag选项进行查询,也可以使用java -XX:+PrintFlagsFinal查看参数默认值。jinfo还可以使用-sysprops选项把虚拟机进程的System.getProperties()的内容打印出来。使用-flag [+|-] name或者-flag name=value可修改一部分运行期可写的虚拟机参数值

查询CMSInitiatingOccupancyFraction参数值

jinfo -flag CMSInitiatingOccupancyFraction 1444

jmap: java内存映像工具

jmap命令用于生成堆转存储快照,一般称为heapdump或dump文件。如果不使用jmap命令,想要获取Java堆转存储快照,还有一些比较暴力的方式,例如使用-XX:+HeapDumpOnOutOfMemoryError参数,可以让虚拟机在OOM异常出现之后自动生成dump文件

jmap的作用并不仅仅是为了获取dump文件,还可以查询finalize执行队列、Java堆和永久代的详细信息,如空间使用率、当前用的那种收集器

jmap命令格式:

jmap [option] vmid

option选项的合法值如下

名称主要作用
-dump生成Java堆转储快照,格式为:-dump:[live, ]format=b, file=,其中live子参数说明是否只dump出存活的对象
-finalizerinfo显示在F-Queue中等待Finalizer线程执行finalize方法的对象
-heap显示Java堆详细信息,如使用哪种回收器、参数配置、分代情况等,只在Linux有效
-histo显示堆中对象统计信息,包括类、实例数量、合计容量
-permstat以ClassLoader为统计口径显示永久代内存状态。只在Linux平台下有效
-F当虚拟机进程对-dump选项没有响应时,可使用这个选项强制生成dump快照,Linux平台下有效

如下示例使用jmap生成一个正在运行的服务的快照文件,其中16652是通过jps命令查询到的LVMID
在这里插入图片描述

jhat: 虚拟机堆转存储快照分析工具

jhat命令与jmap搭配使用,分析jmap生成的堆转存储快照。jhat内置一个微型HTTP/HTML服务器,生成dump文件的分析结果后,可以在浏览器中查看。在实际使用中,通常并不会直接使用jhat命令来分析dump文件,主要原因有

  • 一般不会在部署应用程序的服务器上直接分析dump文件,尽量将dump文件复制到其他机器上进行分析,分析是一个耗时而且消耗硬件资源的过程,在其他机器上进行分析也就没有必要限制使用命令行工具了

  • jhat分析功能相对简陋。VisualVM,以及专业用于分析dump文件的Eclipse Memory Analyzer、IBM HeapAnalyzer等工具,都实现了更强大专业的分析功能

显示"Server is ready"提示后,用户在浏览器中输入http://localhost:7000/即可看到分析结果
在这里插入图片描述
在这里插入图片描述

分析结果默认以包为单位进行分组显示,分析内存泄漏问题主要会使用其中的"Heap Histogram",与jmap -histo功能一样。与OQL叶签功能,前者可以找到内存中总容量最大的对象,后者是标准的对象查询语言,使用类似SQL的语法对内存中的对象进行查询统计

jstack: Java堆栈跟踪工具

jstack命令用于生成虚拟机当前时刻的线程快照,一般称为threaddump或者javacore文件。线程快照即当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的常见原因,如线程间锁死、死循环、请求外部资源导致的长时间等待都是导致线程长时间停顿的常见原因。线程出现停顿时通过jstack来查看各个线程的调用堆栈,可以知道没有响应的线程到底在后台做什么,或等待着什么资源

jstack命令格式:

jstack [option] vmid

option选项的合法值与具体含义表

名称主要作用
-F当正常输出的请求不被响应时,强制输出线程堆栈
-l除堆栈外,显示关于锁的附加信息
-m如果调用到本地方法,可以显示C/C++的堆栈

在这里插入图片描述
在JDK 1.5中,java.lang.Thread类新增了一个getAllStackTraces()方法用于获取虚拟机中所有线程的=StackTraceElement对象。使用这个方法可以简单的几行代码就完成jstack的大部分功能,实际项目中可以调用此方法实现一个管理员页面,可以随时使用浏览器来查看看出堆栈

HSDIS:JIT生成代码反汇编

在Java虚拟机规范中,详细描述了虚拟机指令集中每条指令的执行过程、执行前后对操作数栈、局部变量表的影响等细节。这些细节描述与Sun早期虚拟机高度吻合,但随着技术的发展,高性能虚拟机真正的细节实现方式已经渐渐与虚拟机规范所描述的内容产生越来越大的差距,虚拟机规范中的描述逐渐成了虚拟机实现中的概念模型,实现只能保证规范描述等效。因此在我们分析程序的执行语义问题时,在字节码层面上分析完全可行,但分析程序的执行行为问题时,在字节码层面分析没有什么意义,需要通过其他方式解决

分析程序如何执行,通过软件调试工具来断点调试是最常见手段,但这样的调试方式在Java虚拟机中会遇到很大困难,因为大量执行代码是通过JIT编译动态生成到CodeBuffer中,没有很简单的手段来处理这种混合模式的调试,因此不得不通过一些特别的手段来解决问题,HSDIS插件就是其中之一

HSDIS是一个sun官方推荐的HotSpot虚拟机JIT编译代码的反汇编插件,其包含在HotSpot虚拟机的源码中,没有提供编译后的程序。其作用是让HotSpot的-XX:+PrintAssembly指令调用它来把动态生成的本地代码还原为汇编代码输出,同时生成大量非常有价值的注释,我们可以通过输出的代码来分析问题。可以根据自己操作系统和CPU类型从Project Kenai的网站上下载编译好的插件,直接放到JDK_HOME/jre/bin/client和JDK_HOME/jre/bin/server目录中。如果未找到所需操作系统成品,可以自己使用源码编译

如果使用的是Debug或FastDebug版本的HotSpot,可以直接通过-XX:+PrintAssembly指令使用插件;如果使用Product版本HotSpot,还需要额外加一个-XX:+UnlockDiagnosticVMOption参数

JDK可视化工具

JDK中除提供大量的命令行工具外,还有两个功能强大得到可视化工具: JConsole和VisualVM。其中JConsole是在JDK1.5时期就已经提供的虚拟机监控工具,而VisualVM在JDK1.6 Update7中才首次发布,现在已成为主力推动的多合一故障处理工具,并从JDK中分离出来成为可以独立发展的开源项目

JConsole:Java监视与管理控制台

JConsole是一种基于JMX的可视化监视、管理工具。其管理部分功能是针对JMX MBean进行管理,由于MBean可以使用代码、中间服务器的管理控制台或所有符合JMX规范的软件进行访问

启动JConsole

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

我们选择需要监控对进程后,可以看到主界面共包括"概述"、“内存”、“线程”、“类”、“VM摘要”、"MBean"标签页
在这里插入图片描述
“概述"页签显示整个虚拟机主要运行数据的概览,其中包括"堆内存使用情况”、“线程”、“类”、“CPU使用情况"信息的曲线图,这些曲线是后面"内存”、“线程”、"类"页签的信息汇总

内存监控

"内存"页签相当于可视化的jstat命令,用于监视受收集器管理的虚拟机内存(Java堆和永久代)的变化趋势。我们先开发一个测试示例程序

package main.java.org.aim.oom;

import java.util.ArrayList;
import java.util.List;

/**
 * 测试内存监控示例代码
 */
public 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 InterruptedException {
        fillHeap(10000);
    }
}

设置运行时虚拟机参为:-Xms100m -Xmx100m -XX:+UserSerialGC,运行上述示例,上述代码会以64KB/50毫秒速度往Java堆中填充数据,共填充10000次,通过"内存"页签查看内存变化

我们可以看到整个堆内存是一条向上的平滑曲线,并且从柱状图可以看出,在所有循环结束,运行System.gc()后,虽然整个新生代Eden和Survivor区基本清空,但代表老年代的柱状图仍然保持峰值,说名被填充进堆中的数据在System.gc()方法执行后仍然存活。这是因为作用域内对象依然可访问,如果将System.gc()方法执行放到fillHeap方法外将能正常回收
在这里插入图片描述

内存池Eden区的运行趋势呈现折线状
在这里插入图片描述

Survivor区呈现上升持平一段时间后下降为零的变化趋势
在这里插入图片描述

线程监控

"线程"页签功能相当于可视化jstack命令,遇到线程停顿可以使用这个页签进行监控分析。线程长时间停顿主要是由于等待外部资源(数据库连接、网络资源、设备资源等)、死循环、锁等待(活锁、死锁)。我们先展示一个线程等待的示例

package main.java.org.aim.thread;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * 线程等待示例
 */
public class WaitThread {

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

    /**
     * 线程锁等待演示
     * @param lock
     */
    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 IOException {
        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线程一直在执行空循环,从堆栈追踪中看到WaitThread.java代码停留在20行,20行为while(true) ;此时线程为Runnable状态,没有归还线程执行令牌的动作,会在空循环上用尽全部执行时间直到线程切换,这种等待会消耗较多的CPU资源
在这里插入图片描述
testLockThread线程等待lock对象的notify或notifyAll方法的出现,线程这时候处于WAITING状态,被唤醒前不会分配执行时间,线程处于活锁状态
在这里插入图片描述

接下来给出一个死锁示例

package main.java.org.aim.thread;

/**
 * 线程死锁演示
 */
public class DeadThread {
    static class SynAddRunnable implements Runnable {
        int a, b;

        public SynAddRunnable(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 SynAddRunnable(1, 2)).start();
            new Thread(new SynAddRunnable(2, 1)).start();
        }
    }
}

通过循环加大死锁的概率,上述代码可能出现的一种情况是A线程持有Integer.valueOf(1),尝试获取Integer.valueOf(2)锁,B线程持有Integer.valueOf(2),尝试获取Integer.valueOf(1),这样就导致A、B线程相互等待,出现死锁

出现线程死锁后,点击"检测死锁"按钮,会出现一个新的"死锁"页签
在这里插入图片描述
在这里插入图片描述

我们可以看到线程Thread-53在等待一个被线程Thread-52持有的Integer对象,线程Thread-52则显示在等待一个Integer对象,被线程Thread-53持有

VisualVM:多合一故障处理工具

VisualVM是随JDK发布的功能强大的运行监视和故障处理程序,其除了运行监视、故障处理外,还提供了很多其他方面的功能。如性能分析,而且VisualVM还有一个很大的有点:不需要被监视的程序基于特殊Agent运行,因此对应用程序的实际性能影响很小,使得其可以直接应用在生产环境中

VisualVM兼容范围与插件安装

VisualVM基于NetBeans平台开发,通过插件扩展支持,VisualVM可以做到:

  • 显示虚拟机进程以及进程的配置、环境信息

  • 监视应用程序的CPU、GC、堆、方法区以及线程信息

  • dump以及分析堆转存储快照

  • 方法级的程序运行性能分析、找出被调用最多、运行时间最长的方法

  • 离线程序快照:搜集程序的运行配置、线程dump、内存dump等信息建立一个快照,可以将快照发送开发者进行bug反馈

  • 支持插件扩展

直接启动VisualVM不加载任何插件,则只有基本的监视、线程面板的功能,这些基础功能都是以默认插件的形式提供,因此需要使用更丰富强大的功能,我们需要安装各种功能插件

插件安装即支持手动安装,也支持自动安装。手动安装需要在相关网站下载*.nbm包,点击"工具" -> “插件” -> “已下载”,在弹出对话框中指定nbm包路径便可安装,插件安装完后存在JDK_HOME/lib/visualvm/visualvm中。自动安装只需要在联网的环境下,点击"工具" -> “插件菜单”,进行安装

生成、浏览堆转存快照

在VisualVM中生成dump文件有两种方式

  • 在"应用程序"窗口中右键单击应用程序节点,然后选择"堆Dump"

  • 在"应用程序"窗口双击应用程序节点打开应用程序标签,然后在"监视"标签中单击"堆Dump"

生成dump文件后,应用程序页签将在该堆的应用程序下增加一个[heapdump]开头的子节点,并在主页签中打开该转存储快照。我们可以在heapdump节点上选择"另存为"菜单,将dump文件持久化,否则VisualVM关闭时,会将dump文件当作临时文件删除。如果需要打开一个已经存在的dump文件,可以在文件菜单中"装入"功能,选择硬盘上的dump文件

分析程序性能

在Profiler页签中,VisualVM提供了程序运行期间方法级的CPU执行时间分析以及内存分析,做Profiling分析回对程序运行性能有较大影响,所以一般不在生产环境中使用

开始分析前,先选择"CPU"或"内存",然后切换到应用程序中对程序进行操作,VisualVM会记录这段时间中应用程序执行过的方法。如果是CPU分析将会统计每个方法的执行次数、执行耗时;如果是内存分析,将会统计每个方法关联的对象数以及这些对象所占的空间。

BTrace动态日志追踪

BTrace不仅可以作为VisualVM插件,其本身也可以独立运行。其作用是在不停止目标程序运行前提下,通过HotSpot虚拟机的HotSwap技术动态加入原本并不存在的调试代码。在实际生产中的程序很有意义:经常遇到程序出现问题,但排查错误的一些必要信息,譬如方法参数、返回值等,在开发时并没有打印到日志中,以至于不得不停掉服务,通过加入日志代码来解决问题

在VisualVM中安装BTrace插件后,在应用程序面板中右键单击要调试的程序,会出现"Trace Application…"菜单,点击进入BTrace面板,这个面板看起来像一个简单的Java程序开发环境

我们先看一个演示程序

package main.java.org.aim.BTrace;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class BTraceTest {
    public int add(int a, int b){
        return a + b;
    }

    public static void main(String[] args) throws IOException {
        BTraceTest test = new BTraceTest();
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        for(int i = 0; i < 10; i++){
            reader.readLine();
            int a = (int) Math.round(Math.random() * 1000);
            int b = (int) Math.round(Math.random() * 1000);
            System.out.println(test.add(a, b));
        }
    }
}

在BTrac页签填充TracingScript的内容

package main.java.org.aim.BTrace;

@BTrace
public class TracingScript {
    @OnMethod(clazz="main.java.org.aim.BTrace", method="add", location=@Location(Kind.RETURN))

    public static void func(@Self main.java.org.aim.BTrace instance, int a, int b, @Return int result){
        println("调用堆栈:");
        jstack();
        println(strcat("方法参数A:", str(a)));
        println(strcat("方法参数B:", str(b)));
        println(strcat("方法结果:", str(result)));
    }    
}

点击"Start"完成编译后,在Output面板中出现"BTrace code successfuly deployed"的字样。BTrace会按我们的填充内容打印出调用堆栈、参数、返回值信息。在其官方文档中有进行性能监控、定位连接泄漏和内存泄漏、解决多线程竞争问题等例子

Chapter 4 虚拟机性能监控、故障处理工具 本文介绍了Java虚拟机(JVM)常用的性能监控和故障处理工具。主要包括命令行工具jps(查看进程状态)、jstat(统计信息监控)、jinfo(配置信息查看)、jmap(内存映射和堆转储)、jhat(堆分析)和jstack(线程堆栈跟踪)。还提到了可视化工具如JConsole、JHSDB、VisualVM等,以及阿里开源的Arthas监控工具。这些工具可以帮助开发人员在无GUI环境或生产环境中诊断JVM性能问题,分析内存泄漏、线程死锁等故障场景,是Java应用性能调优和问题排查的重要工具集。 阅读详情

相关推荐

意图识别和纠错问题

可想而知,错误的意图识别会带来多大的负面影响。基于词典,就是对用户query内容和词典内容进行比对,比较常见的方式是序列标注问题里用的最大逆向匹配,通过这种方式找到词典里的实体词,匹配触发了自然就有意图了,而在词典匹配的时候,不是使用链表之类的来构造匹配结构,而是使用搜索树的结构,这种匹配的复杂度最低,速度也快,两者结合,其速度甚至比很多模型要快得多(基本上1ms以内就能完成),fasttext速度非常快,但是textcnn之类的其实就已经达到ms级别以上,bert甚至在10ms级别。

TURING.DT 4573

生化危机9安魂曲绕过版启动蓝屏,或者提示虚拟机监控程序对改用户来说不可用的解决办法

生化危机 9:安魂曲》绕过版启动时出现蓝屏,或提示 “虚拟机监控程序对该用户来说不可用”,是玩家反馈极高的常见问题。这类故障多与系统虚拟化设置、内存管理配置或安全机制冲突相关,以下为亲测有效且步骤清晰的解决方案,涵盖核心修复、辅助排查及注意事项,帮你快速重返游戏。

m0_66363697的博客 4812

史上最小白之RNN详解

1.前言 网上目前已经有诸多优秀的RNN相关博客,但是我写博客的出发点主要是为了加深和巩固自己的理解,所以还是决定自己再进行一下总结和描述,如有不正确的地方欢迎指正~ 2.区分RNN 循环神经网络(Recurrent Neural Network),递归神经网络(Recursive Neural Network),你有没有发现他们的缩写都是RNN,那他们两个是同一回事儿吗?网上有一些博客把这两就当...

Tink1995的博客 4万+

win10家庭版远程桌面_Win10竟然内置了一台虚拟机!教你如何玩转它

[PConline技巧]常玩软件的小伙伴,肯定都知道虚拟机,自然也听说过业界最富名气的Vmware。不过那家伙太庞大了,庞大到一般的电脑跑起来都费劲。其实随着自媒体流行,很多小伙伴也都有了使用虚拟机的需求,比方说录制教程、测试某个吃不太准的软件等等。在我们的Win10内部,其实也内置有一台虚拟机,不仅免费对于电脑硬件的要求也比VMWare低很多!1. 准备一个Windows镜像想要试用虚拟机,首先...

weixin_39737224的博客 1623

auto.js梦幻西游游戏脚本,梦幻西游脚本开发思路

本篇文章给大家谈谈梦幻西游脚本用什么语言写,以及auto.js梦幻西游游戏脚本,希望对各位有所帮助,不要忘了收藏本站喔。

npy199331的博客 1939

全新YOLO26有效涨点改进专栏目录 | 本专栏持续更新500+篇内容 | 包含各种卷积、主干网络、各种注意力机制、检测头、损失函数、小目标检测改进、二次创新模块、独家创新等几百种创新点改进

🔥《2026年YOLO26改进专栏》🔥 🚀持续更新500+最前沿创新改进点(顶会顶刊论文/独家创新策略),涵盖主干网络、各种卷积、注意力机制、检测头等模块,助力科研论文发表与模型性能提升,支持检测/分割/分类任务。订阅即获完整可运行项目,提供专业QQ答疑群,适合科研发论文(SCI/CCF/核心)及工业应用(PCB/医学/遥感检测)。专栏价格将逐步上涨,早订更优惠! ⭐特色:非计算机专业友好、模块可自由组合、全网独家创新;📌适用:研究生大论文和小论文创新、小目标检测、多领域科研应用,满足不同研究需求。

Ai缝合怪、助力小伙伴高效发论文 5129

hyper 虚拟机监控程序功能对于该用户来说不可用_Java大型互联网-不一样的微服务架构性能监控系统与日志收集实现...

引言微服务架构是一项在云中部署应用和服务的新技术。大部分围绕微服务的争论都集中在容器或其他技术是否能很好的实施微服务,而红帽说API应该是重点。微服务可以在“自己的程序”中运行,并通过“轻量级设备与HTTP型API进行沟通”。关键在于该服务可以在自己的程序中运行。通过这一点我们就可以将服务公开与微服务架构(在现有系统中分布一个API)区分开来。在服务公开中,许多服务都可以被内部独立进程所限制。如果...

weixin_42524499的博客 1092

Matlab实现雷达波位编排

1 简介 %本程序用于雷达球坐标系到正弦空间坐标系的转换,以及相控阵雷达的波位编排。 2 完整代码 ​%070228添加波位数据保存clear allclose allclc%波束宽度,单位:度BeamWidth = 3.6;theta05 = round(sin(BeamWidth*pi/180)*1000)/1000;%雷达作用空域AZ = [-15 15]; %方位角范围(雷达球坐标系),单位:度EL = [0 30]; %俯仰角范围(雷

qq_59747472的博客 2479

《深入理解Java虚拟机:性能监控、故障处理工具》

例如,当应用程序出现性能瓶颈或内存泄漏问题时,可以使用jstat和jmap等工具来监测虚拟机的运行状态和内存使用情况,通过分析堆转储快照和线程堆栈信息,能够快速定位问题的根源,并采取相应的优化措施。此外,随着Java技术的不断发展,这些工具也在不断更新和完善,开发人员应及时了解和学习新的工具和功能,以更好地应对不断变化的开发和运维需求。通过使用jstat和jmap等工具,可以有效地监测虚拟机的运行状态和内存使用情况,及时发现和解决潜在的问题,为应用程序的优化和稳定运行提供有力支持。

weixin_51105979的博客 758

YOLOv13保姆级教程+AKConv模块:可变形卷积+自适应核优化,mAP提升3.23%,召回率&mAP50~95显著提升(论文涨点模块已验证)

本文介绍了一种改进的YOLOv13-AKConv模型,通过引入AKConv模块显著提升了目标检测性能。实验结果表明,优化后的模型(绿色曲线)相比原模型(蓝色曲线)在mAP指标上提升了3.23个点,同时召回率、mAP50-95等指标均有明显提升。作者详细阐述了模型移植过程,包括创建yolov13-AKConv.yaml配置文件,修改tasks.py和modules/init.py文件,以及实现AKConv模块的核心代码。该模块采用可变形卷积思想,通过动态生成采样点位置来增强特征提取能力,并集成了BN和SiLU

FJN110的博客 2611

uniapp - 强力解决 swiper 轮播图内嵌套视频导致滑动不流畅卡顿问题,轮播滑块视图容器里既有图片也有视频video组件共同存在出现滑动切换特别卡,轮播组件包裹视频播放器加载慢及层级过高解决

uni-app,h5移动端网页,微信小程序,支付宝小程序,Android安卓,苹果ios,app,nvue,swiper,轮播图,轮播图嵌套视频,卡顿,加载慢,左右滑动不流畅,很卡,滑动过快就会卡住,uniapp使用swiper组件里嵌套视频与图片如何解决卡顿问题,详细解决教程,swiper里有视频video,播放器,视频+图片轮播,层级过高及卡顿问题,没等看完视频就自动切换了,报错,无法加载播放,uniapp的App安卓苹果端,video老是加载,APP端video组件播放视频卡顿,抖音,快手,上下滑动视

🏆 前端领域优质创作者 1万+

JVM——虚拟机性能监控与故障处理工具

第四章:虚拟机性能监控与故障处理工具 jps:虚拟机进程状况工具: 功能与UNIX的ps命令类似。可以列出正在运行的虚拟机进程,并显示虚拟机执行主类名称以及这些进程的本地虚拟机唯一ID。 jstat:虚拟机统计信息监视工具 用于监视虚拟机各种运行状态信息的命令行工具。可以显示虚拟机进程中的类装载、内存、垃圾回收、JIT编译等运行数据。 jmap:Java内存映像工具 用...

wuud__的博客 2522

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

虚拟机性能监控、故障处理工具

基础工具:用于支持基本的程序创建和运行安全:用于程序签名、设置安全测试等国际化:用于创建本地语言文件远程方法调用:用于跨Web或网络的服务交互部署工具:用于程序打包、发布、部署性能监控和故障处理工具REPL和脚本工具。

yuanyajieh的博客 935

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

虚拟机性能监控和故障处理工具

虚拟机性能监控和故障处理工具 该章节仅仅是对各个工具的理论和参数上的简单介绍,具体的使用规则见各个文件中实际使用; 介绍环境 java version "1.8.0_221" Java(TM) SE Runtime Environment (build 1.8.0_221-b11) Java HotSpot(TM) 64-Bit Server VM (build 25.221-b11, mixed...

GJXAIOU 的 优快云 博客 441

《深入理解Java虚拟机》读书笔记:虚拟机性能监控与故障处理工具

虚拟机性能监控与故障处理工具。

fhey的博客 136

Java虚拟机:性能监控与故障处理工具

Java虚拟机:性能监控与故障处理工具 转自:https://blog.youkuaiyun.com/a745233700/article/details/84099558 概述: 给一个系统定位问题的时候,知识、经验是关键基础,数据是依据。工具是运用知识处理数据的手段。这里说的数据包括:运行日志、异常堆栈、GC日志、线程快照文件(threaddump/javacore文件)、堆转储快照(heapdum...

go_pkqL00的博客 195

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

P148~P151。

Lchen_kk的博客 364

《深入理解JAVA虚拟机》第四章 虚拟机性能监控与故障处理工具

《深入理解java虚拟机 笔记》第四章 虚拟机性能监控与故障处理工具常用的虚拟机性能监控JDK命令行工具jps: 显示所有虚拟机进程jstat:监视虚拟机各种运行状态信息jmap:生成堆转储快照(内存映像工具)jstack:Java 线程堆栈跟踪工具虚拟机性能监控JDK可视化工具JConsole:Java 监视与管理控制台VisualVM:多合一故障处理工具 第四章 虚拟机性能监控与故障处理工具 ...

乌鸦大大 615

java虚拟机--虚拟机性能监控与故障处理工具学习笔记

虚拟机性能监控与故障处理工具 jdk的命令行工具 Sun JDK监控和故障处理工具 名称 作用 jps 显示指定系统内所有的HotSpot虚拟机进程 jstat 用于收集HotSpot虚拟机各方面的运行数据 jinfo 显示虚拟机配置信息 jmap 生成虚拟机的内存转储快照 jhat 用于分析heapdump...

xxx 422
上一篇: SkyWalking源码编译及构建本地开发环境
下一篇: 调优案例分析与实战
炒栗子不加糖
博客等级 码龄10年 68粉丝 123原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值