当前位置: 首页 > news >正文

JVM 命令行监控及诊断工具

面试题

        你使用过Java虚拟机性能监控和故障处理工具吗?(美图)
        怎么打出线程栈信息。(字节跳动)
        JVM诊断调优工具用过哪些? (京东)
        怎么获取 Java 程序使用的内存?堆使用的百分比?(国美)
        几种常用的内存调试工具你知道哪些?(搜狐)
        JVM诊断调优工具用过哪些? (蚂蚁金服)

概述

        性能诊断是软件工程师在日常工作中需要经常面对和解决的问题,在用户体验至上的今天,解决好应用的性能问题能带来非常大的收益。

        Java 作为最流行的编程语言之一,其应用性能诊断一直受到业界广泛关注。可能造成 Java 应用出现性能问题的因素非常多,例如线程控制、磁盘读写、数据库访问、网络I/O、垃圾收集等。想要定位这些问题,一款优秀的性能诊断工具必不可少。

        体会1:使用数据说明问题,使用知识分析问题,使用工具处理问题。

        体会2:无监控、不调优!

简单命令行工具

        在我们刚接触java学习的时候,大家肯定最先了解的两个命令就是javac,java,那么除此之外,还有没有其他的命令可以供我们使用呢?我们进入到安装jdk的bin目录,发现还有一系列辅助工具。这些辅助工具用来获取目标 JVM 不同方面、不同层次的信息,帮助开发人员很好地解决Java应用程序的一些疑难杂症。

mac系统下:

windows系统下:

源码:jdk/jdk11: 1ddf9a99e4ad /src/jdk.jcmd/share/classes/sun/tools/

jps:查看正在运行的ava进程

jps(Java Process Status):显示指定系统内所有的HotSpot虚拟机进程(查看虚拟机进程信息),可用于查询正在运行的虚拟机进程。

说明:对于本地虚拟机进程来说,进程的本地虚拟机ID与操作系统的进程ID是一致的,是唯一的。

测试:

public class JPSTest {public static void main(String[] args) {try {Thread.sleep(100000);} catch (InterruptedException e) {e.printStackTrace();}}
}

它的基本使用语法为:

jps [options] [hostid]

我们还可以通过追加参数,来打印额外的信息。

options参数:

        -q :仅仅显示LVMID (local virtual machine id),即本地虚拟机唯一id。不显示主类的名称等

        -l: 输出应用程序主类的全类名 或 如果进程执行的是jar包,则输出jar完整路径

        -m: 输出虚拟机进程启动时传递给主类main()的参数

        -v: 列出虚拟机进程启动时的JVM参数。 比如:-Xms20m -Xmx50m是启动程序指定的jvm参数。

        说明:以上参数可以综合使用。

        补充:如果某 Java 进程关闭了默认开启的UsePerfData参数(即使用参数-XX:-UsePerfData),那么jps命令(以及下面介绍的jstat)将无法探知该 Java 进程。

hostid参数:

        RMI注册表中注册的主机名。如果想要远程监控主机上的 java 程序,需要安装 jstatd。对于具有更严格的安全实践的网络场所而言,可能使用一个自定义的策略文件来显示对特定的可信主机或网络的访问,尽管这种技术容易受到IP地址欺诈攻击。如果安全问题无法使用一个定制的策略文件来处理,那么最安全的操作是不运行jstatd服务器,而是在本地使用jstat和jps工具。

jstat:查看VM统计信息

jstat(JVM Statistics Monitoring Tool):用于监视虚拟机各种运行状态信息的命令行工具。它可以显示本地或者远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。

在没有GUI图形界面,只提供了纯文本控制台环境的服务器上,它将是运行期定位虚拟机性能问题的首选工具。常用于检测垃圾回收问题以及内存泄漏问题。

官方文档:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstat.html

它的基本使用语法为:

jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

查看命令相关参数:jstat -h 或 jstat -help

option参数:

        选项option可以由以下值构成。
        类装载相关的:

  • -class:显示ClassLoader的相关信息:类的装载、卸载数量、总空间、类装载所消耗的时间等。

        垃圾回收相关的:

  • -gc:显示与GC相关的堆信息。包括Eden区、两个Survivor区、老年代、永久代等的容量、已用空间、GC时间合计等信息。
  • -gccapacity:显示内容与-gc基本相同,但输出主要关注Java堆各个区域使用到的最大、最小空间。
  • -gcutil:显示内容与-gc基本相同,但输出主要关注已使用空间占总空间的百分比。
  • -gccause:与-gcutil功能一样,但是会额外输出导致最后一次或当前正在发生的GC产生的原因。
  • -gcnew:显示新生代GC状况
  • -gcnewcapacity:显示内容与-gcnew基本相同,输出主要关注使用到的最大、最小空间
  • -geold:显示老年代GC状况
  • -gcoldcapacity:显示内容与-gcold基本相同,输出主要关注使用到的最大、最小空间
  • -gcpermcapacity:显示永久代使用到的最大、最小空间。

        JIT相关的:

  • -compiler:显示JIT编译器编译过的方法、耗时等信息
  • -printcompilation:输出已经被JIT编译的方法 

-gc说明

1、新生代相关

  • S0C是第一个幸存者区的大小(字节)
  • S1C是第二个幸存者区的大小(字节)
  • S0U是第一个幸存者区已使用的大小(字节)
  • S1U是第二个幸存者区已使用的大小(字节)
  • EC是Eden空间的大小(字节)
  • EU是Eden空间已使用大小(字节)

2、老年代相关

  • OC是老年代的大小(字节)
  • OU是老年代已使用的大小(字节)

3、方法区(元空间)相关

  • MC是方法区的大小
  • MU是方法区已使用的大小
  • CCSC是压缩类空间的大小
  • CCSU是压缩类空间已使用的大小

4、其它

  • YGC是指从应用程序启动到采样时young gc次数
  • YGCT是指从应用程序启动到采样时young gc消耗的时间(秒)
  • FGC是指从应用程序启动到采样时full gc次数
  • FGCT是指从应用程序启动到采样时full gc消耗的时间(秒)
  • GCT是指从应用程序启动到采样时gc的总时间

interval参数:

        用于指定输出统计数据的周期,单位为毫秒。即:查询间隔

count参数:

        用于指定查询的总次数

-t参数:

        可以在输出信息前加上一个Timestamp列,显示程序的运行时间。单位:秒

        经验:我们可以比较 Java 进程的启动时间以及总 GC 时间(GCT 列),或者两次测量的间隔时间以及总 GC 时间的增量,来得出 GC 时间占运行时间的比例。如果该比例超过 20%,则说明目前堆的压力较大;如果该比例超过 90%,则说明堆里几乎没有可用空间,随时都可能抛出 OOM 异常。

-h参数:

        可以在周期性数据输出时,输出多少行数据后输出一个表头信息

补充:

        jstat还可以用来判断是否出现内存泄漏。

        第1步:在长时间运行的 Java 程序中,我们可以运行jstat命令连续获取多行性能数据,并取这几行数据中 OU 列(即已占用的老年代内存)的最小值。

        第2步:然后,我们每隔一段较长的时间重复一次上述操作,来获得多组 OU 最小值。如果这些值呈上涨趋势,则说明该 Java 程序的老年代内存已使用量在不断上涨,这意味着无法回收的对象在不断增加,因此很有可能存在内存泄漏。

jinfo:实时查看和修改VM配置参数

jinfo(Configuration Info for Java):查看虚拟机配置参数信息,也可用于调整虚拟机的配置参数。

在很多情况下,Java应用程序不会指定所有的Java虚拟机参数。而此时,开发人员可能不知道某一个具体的Java虚拟机参数的默认值。在这种情况下,可能需要通过查找文档获取某个参数的默认值。这个査找过程可能是非常艰难的。但有了jinfo工具,开发人员可以很方便地找到Java虚拟机参数的当前值。

官方帮助文档:jinfo

它的基本使用语法为:

jinfo  [ options ] pid

说明:java 进程ID 必须要加上

查看示例:

        示例1:jinfo -sysprops PID

                可以查看由System.getProperties0取得的参数

        示例2:jinfo -flags PID

                查看曾经赋过值的一些参数

        示例3:jinfo -flag 具体参数 PID

                查看某个java进程的具体参数的值

修改示例:

        jinfo不仅可以查看运行时某一个Java虚拟机参数的实际取值,甚至可以在运行时修改部分参数,并使之立即生效。但是,并非所有参数都支持动态修改。参数只有被标记为manageable的flag可以被实时修改。其实,这个修改能力是极其有限的。

        #  可以查看被标记为manageable的参数

        java -XX:+PrintFlagsFinal -version | grep manageable

  • intx CMSAbortablePrecleanWaitMillis            = 100             {manageable}        
  • intx CMSWaitDuration                           = 2000            {manageable}        
  • bool HeapDumpAfterFullGC                       = false           {manageable}        
  • bool HeapDumpBeforeFullGC                      = false           {manageable}        
  • bool HeapDumpOnOutOfMemoryError                = false           {manageable}        
  • ccstr HeapDumpPath                              =                 {manageable}        
  • uintx MaxHeapFreeRatio                          = 100             {manageable}        
  • uintx MinHeapFreeRatio                          = 0               {manageable}        
  • bool PrintClassHistogram                       = false           {manageable}        
  • bool PrintClassHistogramAfterFullGC            = false           {manageable}        
  • bool PrintClassHistogramBeforeFullGC           = false           {manageable}        
  • bool PrintConcurrentLocks                      = false           {manageable}        
  • bool PrintGC                                   = false           {manageable}        
  • bool PrintGCDateStamps                         = false           {manageable}        
  • bool PrintGCDetails                            = false           {manageable}        
  • bool PrintGCTimeStamps                         = false           {manageable} 

        针对boolean类型:jinfo -flag [+|-]具体参数 PID

        针对非boolean类型:jinfo -flag 具体参数=具体参数值 PlD

拓展:

        java -XX:+PrintFlagsInitial 

                查看所有VM参数启动的初始值

        java -XX:+PrintFlagsFinal

                查看所有VM参数的最终值

        java -XX:+PrintCommandLineFlags

                查看那些已经被用户或者JVM设置过的详细的XX参数的名称和值

jmap:导出内存映像文件&内存使用情况

jmap(JVM Memory Map):作用一方面是获取dump文件(堆转储快照文件,二进制文件),它还可以获取目标Java进程的内存相关信息,包括Java堆各区域的使用情况、堆中对象的统计信息、类加载信息等。

开发人员可以在控制台中输入命令“jmap -help”查阅jmap工具的具体使用方式和一些标准选项配置。

官方帮助文档:jmap

它的基本使用语法为:

jmap [option] <pid>
jmap [option] <executable <core>
jmap [option] [server_id@]<remote server IP or hostname>

其中option包括:

说明:这些参数和linux下输入显示的命令多少会有不同,包括也受jdk版本的影响。

-dump

        生成Java堆转储快照:dump文件;特别的:-dump:live只保存堆中的存活对象

-heap

        输出整个堆空间的详细信息,包括GC的使用、堆配置信息,以及内存的使用信息等

-histo

        输出堆中对象的统计信息,包括类、实例数量和合计容量;特别的:-histo:live只统计堆中的存活对象

-permstat

        以ClassLoader为统计口径输出永久代的内存状态信息;仅linux/solaris平台有效

-finalizerinfo

        显示在F-Queue中等待Finalizer线程执行finalize方法的对象;仅linux/solaris平台有效

-F

        当虚拟机进程对-dump选项没有任何响应时,可使用此选项强制执行生成dump文件;仅linux/solaris平台有效

-h | -help

        jmap工具使用的帮助命令

-J <flag>

        传递参数给jmap启动的jvm

基本使用:

        使用1:导出内存映像文件

                一般来说,使用jmap指令生成dump文件的操作算得上是最常用的jmap命令之一,将堆中所有存活对象导出至一个文件之中。

                Heap Dump又叫做堆存储文件,指一个Java进程在某个时间点的内存快照。Heap Dump在触发内存快照的时候会保存此刻的信息如下:

  • All Objects:Class,fields,primitive values and references
  • All Classes:ClassLoader,name,super class,static fields
  • Garbage Collection Roots:Objects defined to be reachable by the JVM
  • Thread Stacks and Local Variables:The call-stacks of threads at the moment of the snapshot,and per-frame information about local objects

                说明:1. 通常在写Heap Dump文件前会触发一次Full GC,所以heap dump文件里保存的都是FullGC后留下的对象信息。2. 由于生成dump文件比较耗时,因此大家需要耐心等待,尤其是大内存镜像生成dump文件则需要耗费更长的时间来完成。

                手动的方式:

                        jmap -dump:format=b,file=<filename.hprof> <pid>
                        jmap -dump:live,format=b,file=<filename.hprof> <pid>

                自动的方式:当程序发生OOM退出系统时,一些瞬时信息都随着程序的终止而消失,而重现OOM问题往往比较困难或者耗时。此时若能在OOM时,自动导出dump文件就显得非常迫切。

                        -XX:+HeapDumpOnOutOfMemoryError:在程序发生OOM时,导出应用程序的当前堆快照。
                        -XX:HeapDumpPath=<filename.hprof>:可以指定堆快照的保存位置。

                示例:-Xmx100m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\m.hprof

        使用2:显示堆内存相关信息

                jmap -heap pid

                -jmap -histo pid

        使用3:其它作用

                jmap -permstat pid:查看系统的ClassLoadert信息

                jmap -finalizerinfo:查看堆积在finalizer队列中的对象

小结:

        由于jmap将访问堆中的所有对象,为了保证在此过程中不被应用线程干扰,jmap需要借助安全点机制,让所有线程停留在不改变堆中数据的状态。也就是说,由jmap导出的堆快照必定是安全点位置的。这可能导致基于该堆快照的分析结果存在偏差。

        举个例子,假设在编译生成的机器码中,某些对象的生命周期在两个安全点之间,那么:live选项将无法探知到这些对象。

        另外,如果某个线程长时间无法跑到安全点,jmap将一直等下去。

        与前面讲的jstat则不同,垃圾回收器会主动将jstat所需要的摘要数据保存至固定位置之中,而jstat只需直接读取即可。

jhat:JDK自带堆分析工具

jhat(JVM Heap Analysis Tool):Sun JDK提供的jhat命令与jmap命令搭配使用,用于分析jmap生成的heap dump文件(堆转储快照)。jhat内置了一个微型的HTTP/HTML服务器, 生成dump文件的分析结果后, 用户可以在浏览器中查看分析结果(分析虚拟机转储快照信息)。

使用了jhat命令,就启动了一个http服务,端口是7000,即http://localhost:7000/,就可以在浏览器里分析。

说明:jhat命令在JDK9、JDK10中已经被删除,官方建议用VisualVM代替。

它的基本使用语法为:

jhat [option] [dumpfile]

option参数:-stack false|true

        关闭 | 打开对象分配调用栈跟踪

option参数:-refs false|true

        关闭 | 打开对象引用跟踪

option参数:-port port-number

        设置jhat HTTP Server的端口号,默认7000

option参数:-exclude exclude-file

        执行对象查询时需要排除的数据成员列表文件

option参数:-baseline exclude-file

        指定一个基准堆转储

option参数:-debug int

        设置debug级别

option参数:-version

        启动后显示版本信息就退出

option参数:-J <flag>

        传入启动参数,比如 -J -Xmx512m

jstack:打印VM中线程快照

面试题

        JVM的进程有哪些线程启动,有了解吗?(神州租车)

面试题解释:

        每当使用java命令执行一个带main方法的类时,就会启动JVM(应用程序),实际上就是在操作系统中启动一个JVM进程,JVM启动时,必然会创建以下5个线程:

        1-main                               主线程,执行我们指定的启动类的main方法

        2-Reference Handler        处理引用的线程 

        3-Finalizer                         调用对象的finalize方法的线程,就是垃圾回收的线程 

        4-Signal Dispatcher          分发处理发送给JVM信号的线程  

        5-Attach Listener              负责接收外部的命令的线程

        Attach Listener :该线程是负责接收到外部的命令,执行该命令,并且把结果返回给发送者。通常我们会用一些命令去要求jvm给我们一些反馈信息,如:java -version、jmap、jstack等等。如果该线程在jvm启动的时候没有初始化,那么,则会在用户第一次执行jvm命令时,得到启动。

        signal dispather: 前面我们提到第一个Attach Listener线程的职责是接收外部jvm命令,当命令接收成功后,会交给signal dispather线程去进行分发到各个不同的模块处理命令,并且返回处理结果。signal dispather线程也是在第一次接收外部jvm命令时,进行初始化工作。

        Finalizer:JVM在垃圾收集时会将失去引用的对象包装成Finalizer对象(Reference的实现),并放入ReferenceQueue,由Finalizer线程来处理;最后将该Finalizer对象的引用置为null,由垃圾收集器来回收。

        Reference Handler :它主要用于处理引用对象本身(软引用、弱引用、虚引用)的垃圾回收问题。

        main:主线程,用于执行我们编写的java程序的main方法。

        编写java应用程序查看JVM启动时创建的所有线程,代码如下:

import java.lang.management.ManagementFactory;
import java.lang.management.ThreadInfo;
import java.lang.management.ThreadMXBean;public class JVMTest {public static void main(String[] args) throws Exception {ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();ThreadInfo[] threadInfos = threadMXBean.dumpAllThreads(false, false);for(ThreadInfo threadInfo : threadInfos) {System.out.println(threadInfo.getThreadId() + "-" + threadInfo.getThreadName());}}
}
//输出如下:
//5-Attach Listener
//4-Signal Dispatcher
//3-Finalizer
//2-Reference Handler
//1-main

jstack(JVM Stack Trace):用于生成虚拟机指定进程当前时刻的线程快照(虚拟机堆栈跟踪)。 线程快照就是当前虚拟机内指定进程的每一条线程正在执行的方法堆栈的集合。

生成线程快照的作用:可用于定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等问题。这些都是导致线程长时间停顿的常见原因。当线程出现停顿时,就可以用jstack显示各个线程调用的堆栈情况。

官方帮助文档:jstack

在thread dump中,要留意下面几种状态 :

  • 死锁,Deadlock(重点关注) 
  • 等待资源,Waiting on condition(重点关注) 
  • 等待获取监视器,Waiting on monitor entry(重点关注) 
  • 阻塞,Blocked(重点关注) 
  • 执行中,Runnable
  • 暂停,Suspended
  • 对象等待中,Object.wait() 或 TIMED_WAITING 
  • 停止,Parked 

它的基本使用语法为:

jstack option pid

jstack管理远程进程的话,需要在远程程序的启动参数中增加:

  • -Djava.rmi.server.hostname=…..
  • -Dcom.sun.management.jmxremote
  • -Dcom.sun.management.jmxremote.port=8888
  • -Dcom.sun.management.jmxremote.authenticate=false
  • -Dcom.sun.management.jmxremote.ssl=false

option参数:-F

        当正常输出的请球不被响应时,强制输出线程堆栈

option参数:-l

        除堆栈外,显示关于锁的附加信息

option参数:-m

        如果调用到本地方法的话,可以显示C/C++的堆栈

option参数:-h

        帮助操作

jcmd:多功能命令行

在JDK 1.7以后,新增了一个命令行工具jcmd。它是一个多功能的工具,可以用来实现前面除了jstat之外所有命令的功能。比如:用它来导出堆、内存使用、查看Java进程、导出线程信息、执行GC、JVM运行时间等。

官方帮助文档:jcmd

jcmd拥有jmap的大部分功能,并且在Oracle的官方网站上也推荐使用jcmd命令代jmap命令。

基本使用语法:

jcmd -I

        列出所有的VM进程

jcmd pid help

        针对指定的进程,列出支持的所有命令

jcmd pid 具体命令

        显示指定进程的指令命令的数据

        你可以探索jcmd中的下述功能,看看有没有适合你项目的监控项:

  • Compiler.CodeHeap_Analytics
  • Compiler.codecache
  • Compiler.codelist
  • Compiler.directives_add
  • Compiler.directives_clear
  • Compiler.directives_print
  • Compiler.directives_remove
  • Compiler.queue
  • GC.class_histogram
  • GC.class_stats
  • GC.finalizer_info
  • GC.heap_dump
  • GC.heap_info
  • GC.run
  • GC.run_finalization
  • VM.class_hierarchy
  • VM.classloader_stats
  • VM.classloaders
  • VM.command_line
  • VM.dynlibs
  • VM.flags
  • VM.info
  • VM.log
  • VM.metaspace
  • VM.native_memory
  • VM.print_touched_methods
  • VM.set_flag
  • VM.stringtable
  • VM.symboltable
  • VM.system_properties
  • VM.systemdictionary
  • VM.unlock_commercial_features
  • VM.uptime
  • VM.version

jstatd:远程主机信息收集

之前的指令只涉及到监控本机的Java应用程序,而在这些工具中,一些监控工具也支持对远程计算机的监控(如jps、jstat)。为了启用远程监控,则需要配合使用jstatd 工具。

命令jstatd是一个RMI服务端程序,它的作用相当于代理服务器,建立本地计算机与远程监控工具的通信。 jstatd服务器将本机的Java应用程序信息传递到远程计算机。

相关文章:

JVM 命令行监控及诊断工具

面试题 你使用过Java虚拟机性能监控和故障处理工具吗&#xff1f;&#xff08;美图&#xff09; 怎么打出线程栈信息。&#xff08;字节跳动&#xff09; JVM诊断调优工具用过哪些&#xff1f; (京东) 怎么获取 Java 程序使用的内存&#xff1f;堆使用…...

飞天使-linux操作的一些技巧与知识点2

TCP 的三次握手 第一次&#xff0c;客户端与服务端建立链接&#xff0c;需要发送请求连接的消息 第二次&#xff0c;服务端接口到数据后&#xff0c;返回一个确认的操作*&#xff08;至此客户端和服务端链路建立成功&#xff09; 第三次&#xff0c;服务端还需要发送要与客户端…...

Android : 篮球记分器app _简单应用

示例图&#xff1a; 1.导包 在build.gradle 中 加入 // 使用androidx版本库implementation androidx.lifecycle:lifecycle-extensions:2.1.0-alpha03 2. 开启dataBinding android{...// 步骤1.开启data bindingdataBinding {enabled true}...} 3.写个类继承 ViewModel pac…...

音视频之旅 - 基础知识

图像基础知识 像素 像素是图像的基本单元&#xff0c;一个个像素就组成了图像。你可以认为像素就是图像中的一个点。在下面这张图中&#xff0c;你可以看到一个个方块&#xff0c;这些方块就是像素 分辨率 图像&#xff08;或视频&#xff09;的分辨率是指图像的大小或尺寸。…...

分类预测 | SSA-HKELM-Adaboost麻雀算法优化混合核极限学习机的数据分类预测

分类预测 | SSA-HKELM-Adaboost麻雀算法优化混合核极限学习机的数据分类预测 目录 分类预测 | SSA-HKELM-Adaboost麻雀算法优化混合核极限学习机的数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.SSA-HKELM-Adaboost麻雀算法优化混合核极限学习机的数据分类…...

如何使用 Zotero 导出所选条目的 PDF 文件

如何使用 Zotero 导出所选条目的 PDF 文件 Zotero 是一款强大的参考文献管理工具&#xff0c;但它并不直接提供将整个文件夹导出为 PDF 的选项。不过&#xff0c;您可以使用以下步骤来导出您所选的 Zotero 条目中的 PDF 文件&#xff0c;无需额外的插件。 选择所需的 Zotero 条…...

minio的k8s的单机部署

minio的k8s的单机部署 apiVersion: apps/v1 kind: Deployment metadata:name: minionamespace: itshare spec:replicas: 1selector:matchLabels:app: miniotemplate:metadata:labels:app: miniospec:containers:- name: minioimage: minio/minio:RELEASE.2022-10-15T19-57-03Z…...

Git 更改remote repo 地址

Git 更改remote repo 地址 我们想更换远程 repo 地址, 因为我们仓库更换了名称. git remote rename origin 查看现在的 romote 地址 # 查看 remote 地址 git remote -v origin gitgitee.com:changyubiao/attrdict.git (fetch) origin gitgitee.com:changyubiao/attrdict.gi…...

24、文件上传漏洞——Apache文件解析漏洞

文章目录 一、环境简介一、Apache与php三种结合方法二、Apache解析文件的方法三、Apache解析php的方法四、漏洞原理五、修复方法 一、环境简介 Apache文件解析漏洞与用户配置有密切关系。严格来说&#xff0c;属于用户配置问题&#xff0c;这里使用ubantu的docker来复现漏洞&am…...

使用Go快速开发TCP公共服务

使用Go快速开发TCP公共服务 文章目录 使用Go快速开发TCP公共服务一、前言二、实现思路三、源码四、测试使用五、最后 一、前言 之前使用的公共TCP服务无法使用了&#xff0c;想了一下整个实现原理不是很复杂&#xff0c;就利用Go快速开发了一个&#xff0c;利用公网服务器可以…...

QEMU环境调试方法

目录 1.如何查看makefile构建过程执行的命令&#xff1f; 2.如何使用GCC生成C程序的宏展开文件&#xff1f; 3.如何在qemu中执行特定的可执行程序&#xff1f; 4.如何在qemu中直接运行可执行程序&#xff1f; 5.如何在qemu中调试某个可执行程序&#xff1f; 本文从调试的角…...

京东数据运营(京东API接口):10月投影仪店铺数据分析

鲸参谋监测的京东平台10月份投影仪市场销售数据已出炉&#xff01; 10月份&#xff0c;环同比来看&#xff0c;投影仪市场销售均上涨。鲸参谋数据显示&#xff0c;今年10月&#xff0c;京东平台投影仪的销量为16万&#xff0c;环比增长约22%&#xff0c;同比增长约8%&#xff1…...

Aloha 机械臂的学习记录2——AWE:AWE + ACT

继续下一个阶段&#xff1a; Train policy python act/imitate_episodes.py \ --task_name [TASK] \ --ckpt_dir data/outputs/act_ckpt/[TASK]_waypoint \ --policy_class ACT --kl_weight 10 --chunk_size 50 --hidden_dim 512 --batch_size 8 --dim_feedforward 3200 \ --n…...

Spring Boot 项目的创建、配置文件、日志

文章目录 Spring Boot 优点创建 Spring Boot 项目创建项目认识目录网页创建&#xff08;了解&#xff09; 约定大于配置Spring Boot 配置文件配置文件格式读取配置项properties 配置文件yml 配置文件基本语法进阶语法配置对象配置集合yml 设置不同环境的配置文件 Spring Boot 日…...

MySQL:drop、delete与truncate区别

一、用法不同 1、drop(丢弃数据): drop table 表名 &#xff0c;直接将表都删除掉&#xff0c;在删除表的时候使用。 2、truncate (清空数据) : truncate table 表名 &#xff0c;只删除表中的数据&#xff0c;再插入数据的时候自增长 id 又从 1 开始&#xff0c;在清空表中数…...

2024年顶级的9个 Android 数据恢复工具(免费和付费)

不同的事情可能会损坏您的Android手机并导致您丢失数据。但大多数时候&#xff0c;您可以使用取证工具恢复部分或全部文件。 问题可能来自手机的物理损坏、磁盘的逻辑故障、完整的系统擦除&#xff0c;或者只是简单的粗心大意。 但是&#xff0c;无论数据丢失的原因是什么&am…...

c# Aspose.Cells 导出Excel表格 使用随记

/// <summary>/// 导出Excel表格/// </summary>/// <param name"list">数据集合</param>/// <param name"header">数据表头</param>/// <param name"sumColumn">求和列</param>/// <param n…...

SAP UI5 walkthrough step3 Controls

在上一步&#xff0c;我们是直接用index.html 中的body 里面的DIVision去输出 hello world&#xff0c; 在这个章节&#xff0c;我们将用SAP UI5 的标准控件 sap/m/Text 首先&#xff0c;我们去修改 webapp/index.html <!DOCTYPE html> <html> <head><…...

【分布式微服务专题】从单体到分布式(一、SpringCloud项目初步升级)

目录 前言阅读对象阅读导航前置知识笔记正文一、单体服务介绍二、服务拆分三、分布式微服务升级前的思考3.1 关于SpringBoot/SpringCloud的思考【有点门槛】 四、SpringCloud升级整合4.1 新建父子项目 学习总结感谢 前言 从本节课开始&#xff0c;我将自己手写一个基于SpringC…...

python安装与工具PyCharm

摘要&#xff1a; 周末闲来无事学习一下python&#xff01;不是你菜鸡&#xff0c;只不过是对手太强了&#xff01;所以你要不断努力&#xff0c;去追求更高的未来&#xff01;下面先了解python与环境的安装与工具的配置&#xff01; python安装&#xff1a; 官网 进入官网下载…...

Baumer工业相机堡盟工业相机如何通过BGAPISDK将相机图像高速保存到电脑内存(C#)

Baumer工业相机堡盟工业相机如何通过BGAPISDK将相机图像高速保存到电脑内存&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机图像保存到电脑内存的技术背景代码分析注册SDK回调函数BufferEvent声明可以存储相机图像的内存序列和名称在图像回调函数中将图像保存在内存序…...

iOS 防截屏方法(一)

利用UITextField的安全输入secureTextEntry来实现防截屏效果&#xff0c;上代码&#xff1a; // 将 textField 添加到父视图UITextField *textField [[UITextField alloc] init];textField.backgroundColor [UIColor whiteColor];textField.secureTextEntry YES;[self.view …...

【SpringBoot篇】5种类型参数传递json数据传参的操作

&#x1f38a;专栏【SpringBoot】 &#x1f354;喜欢的诗句&#xff1a;天行健&#xff0c;君子以自强不息。 &#x1f386;音乐分享【如愿】 &#x1f384;欢迎并且感谢大家指出小吉的问题&#x1f970; 文章目录 &#x1f33a;普通参数&#x1f33a;POJO参数&#x1f33a;嵌套…...

Mac系统升级node.js版本和npm版本

升级node.js版本 第一步&#xff1a;查询当前node.js版本 node -v 第二步&#xff1a;清除node.js的缓存 sudo npm cache clean -f 第三步&#xff1a;验证缓存是否清空 npm cache verify 第四步&#xff1a;安装n工具&#xff0c;n工具是专门用于管理node.js版本的工具…...

风力发电对讲 IP语音对讲终端IP安防一键呼叫对讲 医院对讲终端SV-6005网络音频终端

风力发电对讲 IP语音对讲终端IP安防一键呼叫对讲 医院对讲终端SV-6005网络音频终端 目 录 1、产品规格 2、接口使用 2.1、侧面接口功能 2.2、背面接口功能 2.3、面板接口功能 3、功能使用 1、产品规格 输入电源&#xff1a; 12V&#xff5e;24V的直流电源 网络接口&am…...

智能优化算法应用:基于蜉蝣算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于蜉蝣算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于蜉蝣算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.蜉蝣算法4.实验参数设定5.算法结果6.参考文献7.MA…...

pymysql报错: unable to rollback、Already closed

参考&#xff1a; https://www.coder.work/article/4516746 https://www.cnblogs.com/leijiangtao/p/11882107.html https://stackoverflow.com/questions/55116007/pymysql-query-unable-to-rollback unable to rollback处理&#xff1a; # 关闭光标对象 cursor.close() # 关…...

[Linux] Web基础知识与http协议

一、HTML 1.1 HTML 的概念 HTML被称为超文本标记语言。 它是规范和标准. 它通过标记符号来标记网页中出现的各个部分。网页文件本身就是一种文本文件。 通过向文本文件添加标记&#xff0c;您可以告诉浏览器如何显示其中的内容。 HTML命令可以描述文本、图形、动画、声音、表格…...

2020年第九届数学建模国际赛小美赛B题血氧饱和度的变异性解题全过程文档及程序

2020年第九届数学建模国际赛小美赛 B题 血氧饱和度的变异性 原题再现&#xff1a; 脉搏血氧饱和度是监测患者血氧饱和度的常规方法。在连续监测期间&#xff0c;我们希望能够使用模型描述血氧饱和度的模式。   我们有36名受试者的数据&#xff0c;每个受试者以1 Hz的频率连…...

【Flink on k8s】- 11 - 使用 Flink kubernetes operator 运行 Flink 作业

目录 1、创建本地镜像库 1.1 拉取私人仓库镜像 1.2 运行 1.3 本地浏览器访问 5000 端口...